Although Django is well packaged for Debian, I've recently come to the conculsion that the packages are really not what I want. The problem is that my server runs Debian stable, while my development laptop runs unstable, and Django revisions definitely fall into the "unstable" category. There really is no way to use a system Django 1.1 on one side, and a system Django 1.0 on the other.
After a bit of work, I think I've got something together that works, and I post it here in the hope it is useful for someone else. This info has been gleaned from similar references such as this <http://www.danceric.net/2009/03/26/django-virtualenv-and-mod_wsgi/> and this <http://www.saltycrane.com/blog/2009/05/notes-using-pip-and-virtualenv-django/>.
This is aimed at running a server using Debian stable (5.0) for production and an unstable environment for development. You actually need both to get this running. This is based on a project called "project" that lives in /var/www
First step is to install python-virtualenv on both.
Create a virtualenv on both, using the --no-site-packages to make it a stand-alone environment. This is like a chroot for python.
$ virtualenv --no-site-packages project New python executable in project/bin/python Installing setuptools............done.
The unstable environment has a file you'll need to copy into the stable environment - bin/activate_this.py. The stable version of python-virtualenv isn't recent enough to include this file, but you need it to essentially switch the system python into the chrooted environment. This will come in handy later when setting up the webserver.
There are probably better ways to keep the two environments in sync, but I simply take a manual approach of doing everything twice, once in each. So from now on, do the following in both environments.
Activate the environment
/var/www$ cd project /var/www/project$ . bin/activate (project) /var/www/project$
Use easy_install to install pip
(project) /var/www/project$ easy_install pip Searching for pip Reading http://pypi.python.org/simple/pip/ Reading http://pip.openplans.org Best match: pip 0.4 Downloading http://pypi.python.org/packages/source/p/pip/pip-0.4.tar.gz#md5=b45714d04f8fd38fe8e3d4c7600b91a2 Processing pip-0.4.tar.gz Running pip-0.4/setup.py -q bdist_egg --dist-dir /tmp/easy_install-Wu9O-U/pip-0.4/egg-dist-tmp-xjSdxq warning: no previously-included files matching '*.txt' found under directory 'docs/_build' no previously-included directories found matching 'docs/_build/_sources' zip_safe flag not set; analyzing archive contents... pip: module references __file__ Adding pip 0.4 to easy-install.pth file Installing pip script to /var/www/project/bin Installed /var/www/project/lib/python2.5/site-packages/pip-0.4-py2.5.egg Processing dependencies for pip Finished processing dependencies for pip
Install setuptools, also using easy_install (for some reason, pip can't install it). There is a trick here, you need to specify at least version 0.6c9 or there will be issues with the SVN version on Debian stable when you try to get Django in the next step.
(project) /var/www/project$ easy_install setuptools==0.6c9 Searching for setuptools==0.6c9 Reading http://pypi.python.org/simple/setuptools/ Best match: setuptools 0.6c9 Downloading http://pypi.python.org/packages/2.5/s/setuptools/setuptools-0.6c9-py2.5.egg#md5=fe67c3e5a17b12c0e7c541b7ea43a8e6 Processing setuptools-0.6c9-py2.5.egg Moving setuptools-0.6c9-py2.5.egg to /var/www/project/lib/python2.5/site-packages Removing setuptools 0.6c8 from easy-install.pth file Adding setuptools 0.6c9 to easy-install.pth file Installing easy_install script to /var/www/project/bin Installing easy_install-2.5 script to /var/www/project/bin Installed /var/www/project/lib/python2.5/site-packages/setuptools-0.6c9-py2.5.egg Processing dependencies for setuptools==0.6c9 Finished processing dependencies for setuptools==0.6c9
Create a requirements.txt with the path to the Django SVN for pip to install, then and then install it.
(project) /var/www/project$ cat requirements.txt -e svn+http://code.djangoproject.com/svn/django/tags/releases/1.0.3/#egg=Django (project) /var/www/project$ pip install -r requirements.txt Obtaining Django from svn+http://code.djangoproject.com/svn/django/tags/releases/1.0.3/#egg=Django (from -r requirements.txt (line 1)) Checking out http://code.djangoproject.com/svn/django/tags/releases/1.0.3/ to ./src/django (project) /var/www/project$ pip install -r requirements.txt Obtaining Django from svn+http://code.djangoproject.com/svn/django/tags/releases/1.0.3/#egg=Django (from -r requirements.txt (line 1)) Checking out http://code.djangoproject.com/svn/django/tags/releases/1.0.3/ to ./src/django ... so on ...
Almost there! You can keep installing more Python requirements with pip if you need, but we've got enough here to start.
Create a file in /var/www/project called project-python.py. This will be the Python interpreter the webserver uses, and basically exec's itself into the virtalenv. The file should contain the following:
activate_this = "/var/www/project/bin/activate_this.py" execfile(activate_this, dict(__file__=activate_this)) from django.core.handlers.modpython import handler
Now it's time to start the Django project. I like to create a new directory called project, which will be the parent directory kept in the SCM with all the code, media, templates, database (if using SQLite) etc. In this way to keep the two environments up-to-date I simply svn ci on one side, and svn co on the other.
(project) /var/www/project$ mkdir project (project) /var/www/project/project$ mkdir db django media www (project) /var/www/project/project$ cd django/ (project) /var/www/project/project/django$ django-admin startproject myproject
Last step now is to wire-up Apache to serve it all up. The magic is making sure you specify the correct PythonHandler that you made before to use the virtualenv, and include the right paths so you can find it and all the required Django settings.
DocumentRoot /var/www/project <Location "/"> SetHandler python-program PythonHandler project-python PythonPath "['/var/www/project/','/var/www/project/project/django/'] + sys.path" SetEnv DJANGO_SETTINGS_MODULE myproject.settings PythonDebug On </Location> Alias /media /var/www/project/project/media <Location "/media"> SetHandler none </Location> <Directory "/var/www/project/project/media"> AllowOverride none Order allow,deny Allow from all Options FollowSymLinks Indexes </Directory>
With all this, you should be up and running in a basic but stable environment. It's easy enough to update packages for security fixes, etc via pip after activating your virtualenv.