Django 1.5 on Debian Squeeze

Published: by Creative Commons Licence

Time to read: 4 minutes

Debian Squeeze has packages for Python 3.1 but Django 1.5 requires Python 3.2. In this article I will describe how to set up Django 1.5 on Debian Squeeze and Apache by using Python 3.3.2 and the Apache module mod-wsgi compiled from sources.

Preparation

First create the required directories.

mkdir -p /opt/python
mkdir -p /opt/mod-wsgi
chmod 755 /opt/python

Then download and unpack Python 3.3.

cd /opt/python
wget http://www.python.org/ftp/python/3.3.2/Python-3.3.2.tgz
tar xvzf Python-3.3.2.tgz
ln -s Python-3.3.2 current
cd current
mkdir src
mv * src

And the same for mod-wsgi

cd /opt/mod-wsgi
wget http://ftp.de.debian.org/debian/pool/main/m/mod-wsgi/mod-wsgi_3.4.orig.tar.gz
tar xvzf mod-wsgi_3.4.orig.tar.gz
ln -s mod_wsgi-3.4 current
cd current
mkdir src
mv * src

I use the current links only to make it easier to switch between versions. Of course, you should go straight to download the latest version.

If you have Python 3.1 and the corresponding mod-wsgi installed from the Debian Squeeze package manager, you should uninstall both first. Anyway - it makes sense to install them first, because then you get the config-scripts for mod-wsgi for the Apache webserver.

aptitude install libapache2-mod-wsgi-py3
aptitude remove libapache2-mod-wsgi-py3

Compiling

First I compile Python 3.3

cd /opt/python/current/src
./configure --prefix /opt/python/Python-3.3.2 --enable-shared
make && make install

--prefix specifies the target directory for the installation. --enable-shared indicates that Python 3.3 is built with shared libraries. This is important because it is needed to build mod-wsgi. If configure or make error messages raises about missing dependencies, you have to install them as -dev packages using Debian package manager.

If you now start Python 3.3, you will receive a Error message.

./python3
./python3: error while loading shared libraries: libpython3.3m.so.1.0: cannot open shared object file: No such file or directory

This occurs because the generated shared library libpython3.3m is assigned to the system is not yet known. So make it known.

cd /etc/ld.so.conf.d
echo "/opt/python/current/lib" >>python.conf
ldconfig

The created file does not have to be python.conf. ldconfig makes the content of the new file known to the system and now Python 3 starts as well.

ln -s /opt/python/current/bin/python3 /usr/bin/python3
python3
Python 3.3.2 (default, Aug 17 2013, 19:38:58) 
[GCC 4.4.5] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>>

Pyhton 3 is up and ready. Now use the created shared library to build the Apache modules mod-wsgi.

cd /opt/mod-wsgi/current/src
./configure --prefix /opt/mod-wsgi/mod_wsgi-3.4 --with-python=/opt/python/current/bin/python3
make && make install

When you called make the error message /usr/bin/ld: cannot find -lpython3.3 will raise. In fact, the created file is called /opt/python/current/lib/libpython3.3m.so. So adjust the Makefile line starting with LDLIBS. Now it finds the shared library and can bind it.

LDLIBS = -lpython3.3m -lpthread -ldl -lutil -lm

Although shared libraries begin with the prefix lib, you don't write it. Same for the file extension.

make && make install

[...]

----------------------------------------------------------------------
Libraries have been installed in:
   /usr/lib/apache2/modules

If you ever happen to want to link against installed libraries
in a given directory, LIBDIR, you must either use libtool, and
specify the full pathname of the library, or use the `-LLIBDIR'
flag during linking and do at least one of the following:
   add LIBDIR to the `LD_LIBRARY_PATH' environment variable
 during execution
   add LIBDIR to the `LD_RUN_PATH' environment variable
 during linking
   use the `-Wl,-rpath -Wl,LIBDIR' left flag
   have your system administrator add LIBDIR to `/etc/ld.so.conf'

See any operating system documentation about shared libraries for
more information, search as the ld(1) and ld.so(8) manual pages.
----------------------------------------------------------------------
chmod 644 /usr/lib/apache2/modules/mod_wsgi.so

make install has already included the compiled file mod_wsgi.so in the correct directory to /usr/lib/apache2/modules/. Apache is ready to go.

By uninstalling the Debian package from mod-wsgi Apache has kept its config files, but they are no longer active. I reactivated them through symbolic links.

cd /etc/apache2/mods-enabled
ln -s ../mods-available/wsgi-load wsgi.load
ln -s ../mods-available/wsgi-conf wsgi.conf
/etc/init.d/apache2 reload

Postprocessing

The work is almpst done. Here are a few more Additional information.

In an Apache virtual host, I used the command WSGIScriptAlias /wsgi /home/wsgitest/wsgi the directory in which Apache executes Python scripts. I did not create other configurations for a first test. The installation of the Django framework:

mkdir /tmp/off
cd /tmp/off
wget https://www.djangoproject.com/m/releases/1.5/Django-1.5.2.tar.gz
tar xvzf Django-1.5.2.tar.gz
cd Django-1.5.2.tar.gz
python3 setup.py install