Django en serveur - Sommaire : Site en Python (Django) sous Apache avec mod_wsgi.

(Voici la suite de ma petite série "faire mumuse avec python sur son serveur".)

Nous venons de voir la mise en ligne de notre projet développé en python en utilisant mod_python.

Mais aujourd'hui, nous pouvons utiliser un nouveau module, plus performant que ce dernier, alors pourquoi s'en priver ?

Tout d'abord, installons le. Sous Debian, voici la commande :

apt-get install libapache2-mod-wsgi

Puis activons le :

a2enmod wsgi

ou à la mano :

ln -s /etc/apache2/mods-available/wsgi.load /etc/apache2/mods-enabled/
ln -s /etc/apache2/mods-available/wsgi.conf /etc/apache2/mods-enabled/

Remarquez qu'il y a aussi un fichier de configuration !
(par défaut, ce fichier de configuration est entièrement commenté. Vous pouvez donc l'ignorer.)

Maintenant, passons aux choses sérieuses, voici à quoi ressemblera votre VirtualHost :

<VirtualHost *:80>
        ServerAdmin postmaster@[domain].tld
        ServerName www.[domain].tld
        ServerAlias [domain].tld
        DocumentRoot /var/www/[domain]/www/[domain]
 
        ErrorLog /var/log/apache2/[domain]_error.log
        LogLevel warn
        CustomLog /var/log/apache2/[domain]_access.log combined
        ServerSignature Off
 
        WSGIScriptAlias / /var/www/[domain]/www/[project_name]/django.wsgi
 
        Alias /media "/var/www/[domain]/www/media"
        <Location "/media/">
                SetHandler None
        </Location>
 
        Alias /static "/var/www/[domain]/www/static"
        <Location "/static/">
                SetHandler None
        </Location>
 
        <LocationMatch "\.(jpg|gif|png)$">
                SetHandler None
        </LocationMatch>
</VirtualHost>

Je passerai sur l'explication des directives pour media et static, que vous trouverez sur le précédent article.

La ligne qui nous intéressent vraiment ici, c'est :
WSGIScriptAlias / /var/www/[domain]/www/[domain]/django.wsgi.

Comme nous l'avions vu dans le précédent article, ma structure de dossier est faite de telle manière que j'ai un dossier correspondant au sous domaine (ici, www), et dedans, trois dossiers :
domain (le même nom que le domaine (aka le nom du projet), qui contiens le code python,
static et
templates).

Maintenant, voici le contenu du fichier django.wsgi :

import os
import sys

sys.path.append('/var/www/[domain]/www/')

os.environ['DJANGO_SETTINGS_MODULE'] = 'domain.settings'

import django.core.handlers.wsgi
application = django.core.handlers.wsgi.WSGIHandler()

Remarquez que j'ajoute le projet au python path (avec la ligne "sys.path.append"). Je ne précise pas le répertoire qui contiens le code, car la ligne d'après s'en charge (de "/var/www/[domain]/www/" à "domain.settings", j'obtiens /var/www/[domain]/www/[domain]/settings.py !

Redémarrez Apache et voilà !

Tout fonctionne !

Bon, la première fois, ça peut-être un peu long à charger, mais ensuite, le site sera fluide et agréable à naviguer !

Si vous avez des problèmes avec le thème de la partie Admin, vous avez oublié de faire un lien symbolique vers le répertoire "media" du module admin de Django. Pour avoir la démarche, c'est ici.

De plus, si vous désirez plus de détails concernant le module Wsgi, cette page vous aidera probablement.

Posted by Cyril Nicodème