How to create multiple Django environments using virtualenv

Spesso capita di dover lavorare su svariate applicazioni "Django":http://www.djangoproject.com/, ognuna dipendente da librerie diverse. Può succedere ad esempio di lavorare su un progetto in Django 1.1 e di doverne iniziare uno nuovo con l'ultima versione del framework. La soluzione migliore è quella di tenere i vari ambienti separati, in modo di garantire ad ogni progetto l'accesso alle sole librerie da cui dipende. Python ci propone "virtualenv":http://pypi.python.org/pypi/virtualenv, un tool per creare multipli ambienti isolati. Ogni ambiente è completamente autonomo dagli altri e dai pacchetti installati nel site-packages di sistema. Vediamo allora come creare un virtualenv ed installarvi l'ultima versione di Django (ad oggi 1.2.1). h1. 1- Installare python-setuptools La prima cosa da fare è installare python-setuptools, in modo da avere accesso al comando "easy_install":http://pypi.python.org/pypi/setuptools per poter scaricare pacchetti in facilità. In alternativa è possibile ottenere gli stessi risultati utilizzando il pacchetto "pip":http://pypi.python.org/pypi/pip. Apriamo dunque una console e digitiamo i seguenti comandi:

stefano@stefano-laptop:~$ sudo apt-get install python-setuptools
Reading package lists... Done
Building dependency tree       
Reading state information... Done
python-setuptools is already the newest version.
0 upgraded, 0 newly installed, 0 to remove and 132 not upgraded.
stefano@stefano-laptop:~$
h1. 2- Installare virtualenv Il secondo passo consiste nell'installare il pacchetto virtualenv utilizzando easy_install:

stefano@stefano-laptop:~$ sudo easy_install virtualenv
[sudo] password for stefano: 
Searching for virtualenv
Reading http://pypi.python.org/simple/virtualenv/
Reading http://virtualenv.openplans.org
Best match: virtualenv 1.4.9
Downloading http://pypi.python.org/packages/source/v/virtualenv/virtualenv-1.4.9.tar.gz#md5=c49067cab242b5ff8c7b681a5a99533a
Processing virtualenv-1.4.9.tar.gz
Running virtualenv-1.4.9/setup.py -q bdist_egg --dist-dir /tmp/easy_install-3D0IWT/virtualenv-1.4.9/egg-dist-tmp-xe4LRm
warning: no previously-included files matching '*.*' found under directory 'docs/_templates'
Adding virtualenv 1.4.9 to easy-install.pth file
Installing virtualenv script to /usr/local/bin

Installed /usr/local/lib/python2.6/dist-packages/virtualenv-1.4.9-py2.6.egg
Processing dependencies for virtualenv
Finished processing dependencies for virtualenv
h1. 3- Creare l'ambiente virtuale Una volta installato il pacchetto virtualenv sarà necessario creare uno spazio in cui ospitare i molteplici ambienti. Nel mio caso, ho preferito creare una directory nella mia home, piuttosto che in un altro folder scrivibile del filesystem.

stefano@stefano-laptop:~$ cd Progetti/Python/
stefano@stefano-laptop:~/Progetti/Python$
stefano@stefano-laptop:~/Progetti/Python$ mkdir virtualenvs
stefano@stefano-laptop:~/Progetti/Python$ cd virtualenvs/
stefano@stefano-laptop:~/Progetti/Python/virtualenvs$
A questo punto creiamo il reale virtualenv, che chiameremo "django-1.2-env". Notiamo che al comando virtualenv abbiamo aggiunto come argomento --no-site-packages: in questo modo il nostro ambiente virtuale avrà solamente un set minimale di librerie nel proprio folder site-packages. Teniamo inoltre presente che tutti i comandi che inseriremo d'ora in poi non necessitano dell'accesso come super utente via sudo.

stefano@stefano-laptop:~/Progetti/Python/virtualenvs$ virtualenv --no-site-packages django-1.2-env
New python executable in django-1.2-env/bin/python
Installing setuptools............done.
h1. 4- Scaricare Django in /tmp Apriamo una nuova console e scarichiamo il tarball con l'ultima versione del framework Django. Per semplicità, ho scaricato il pacchetto in /tmp.

stefano@stefano-laptop:~$ cd /tmp/
stefano@stefano-laptop:/tmp$ wget http://www.djangoproject.com/download/1.2.1/tarball/
--2010-08-28 11:20:58--  http://www.djangoproject.com/download/1.2.1/tarball/
Resolving www.djangoproject.com... 64.207.133.18
Connecting to www.djangoproject.com|64.207.133.18|:80... connected.
HTTP request sent, awaiting response... 301 Moved Permanently
Location: http://media.djangoproject.com/releases/1.2/Django-1.2.1.tar.gz [following]
--2010-08-28 11:20:59--  http://media.djangoproject.com/releases/1.2/Django-1.2.1.tar.gz
Resolving media.djangoproject.com... 64.207.133.30
Connecting to media.djangoproject.com|64.207.133.30|:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: 6248006 (6.0M) [application/octet-stream]
Saving to: `Django-1.2.1.tar.gz'

100%[======================================>] 6,248,006    590K/s   in 12s     

2010-08-28 11:21:11 (523 KB/s) - `Django-1.2.1.tar.gz' saved [6248006/6248006]
h1. 5- Installare Django nel virtualenv A questo punto, scompattiamo Django e attiviamo il virtualenv (tramite il comando "source virtualenvdir/bin/activate"). Una volta attivato il virtualenv troveremo il suo nome preposto nella shell: (django-1.2-env)stefano@stefano-laptop

stefano@stefano-laptop:/tmp$ tar xzfv Django-1.2.1.tar.gz
stefano@stefano-laptop:/tmp/Django-1.2.1$ source /home/stefano/Progetti/Python/virtualenvs/django-1.2-env/bin/activate
(django-1.2-env)stefano@stefano-laptop:/tmp/Django-1.2.1$
(django-1.2-env)stefano@stefano-laptop:/tmp/Django-1.2.1$ python setup.py install
Verifichamo dunque che Django sia stato installato correttamente nel site-packages dell'ambiente virtuale:

stefano@stefano-laptop:~/Progetti/Python/virtualenvs/django-1.2-env$ ls lib/python2.6/site-packages/
django           easy-install.pth   setuptools-0.6c11-py2.6.egg
Django-1.2.1-py2.6.egg-info  pip-0.7.2-py2.6.egg  setuptools.pth
h1. 6- Creare un nuovo progetto Possiamo ora creare un nuovo progetto utilizzando il comando django-admin.py come richiesto dal framework.

(django-1.2-env)stefano@stefano-laptop:/tmp/Django-1.2.1$ cd /home/stefano/Progetti/Python/
(django-1.2-env)stefano@stefano-laptop:~/Progetti/Python$ 
(django-1.2-env)stefano@stefano-laptop:~/Progetti/Python$ django-admin.py startproject newdjangoapp
(django-1.2-env)stefano@stefano-laptop:~/Progetti/Python$ cd newdjangoapp/
(django-1.2-env)stefano@stefano-laptop:~/Progetti/Python/newdjangoapp$ ls
__init__.py  manage.py  settings.py  urls.py
In conclusione, possiamo dire che virtualenv rappresenta un'ottima soluzione per creare ambienti completamente indipendenti e finalizzati ad ospitare ogni singolo progetto. In questo modo, possiamo evitare conflitti di librerie e abbiamo la possibilità di sperimentare a piacimento nuove configurazioni evitando di creare problemi alle altre applicazioni.