Best practice for package install on django server
@Mounir's answer is pretty solid- but I wanted to tag on another piece of advice- using playbooks from Ansible Galaxy is also another option.  Existing playbooks already exist for lots of usecases (including Django) and they take into account many of these best practices.  I am not saying that all playbooks on Galaxy are good- but some are, and by virtue of being open source, they are frequently patched and updated.
So I'm setting up a server by myself. Now I ran into lots of different ways where to install the packages.
I am thinking of the core packages like nginx, gunicorn, python3, postgresql and so on.
I learned that setting up a VENV (virtual environment) is a good thing so I can have several projects running with different versions on packages.
But it's a bit confusing wich ones are not going to be inside the VENV.
Some install postgreSQL outside the VENV, but psycopg2 inside. Some the gunicorn inside VENV. and so on.
Are there any best practices or rules that are better safe to follow?
For info. I'm setting up a Ubuntu server 16.04 with Nginx, gunicorn. PostgreSQL, psycopg2, python3