Pré-requis
Le système d'exploitation utilisé est Ubuntu 10.04.3 LTS x64.
Les paquets suivants sont requis :
On installe les paquets :
~$ sudo apt-get install apache2 libapache2-mod-wsgi python python-django
Création du site Django
Le projet idreammicro servant de support à cet article se situe dans le dossier /var/www/idreammicro. L'application se nomme helloworld. L'arborescence est donc la suivante :
/var/www/ |_idreammicro |_helloworld
Création du projet idreammicro
On se place dans le dossier accueillent les sites web par défaut /var/www :
~$ cd /var/www
On crée un projet Django nommé idreammicro :
/var/www$ sudo django-admin startproject idreammicro
Les fichiers suivants sont créés dans le dossier /var/www/idreammicro :
- __init__.py ;
- manage.py ;
- settings.py ;
- urls.py.
On se place dans le dossier du projet :
/var/www$ cd idreammicro/
On vérifie que le projet est correctement créé en lançant le serveur de développement intégré à Django :
/var/www/idreammicro$ python manage.py runserver
Si tout se passe bien, le message suivant apparaît dans la console :
Validating models... 0 errors found Django version 1.1.1, using settings 'idreammicro.settings' Development server is running at http://127.0.0.1:8000/ Quit the server with CONTROL-C.
La console nous informe que le serveur de développement Django est accessible à l'adresse http://127.0.0.1:8000. Si on ouvre le lien, la page ci-dessous doit s'afficher.
Création de l'application helloworld
On crée une application nommée helloworld :
/var/www/idreammicro$ sudo python manage.py startapp helloworld
Les fichiers suivants sont créés dans le dossier /var/www/idreammicro/helloworld :
- __init__.py ;
- models.py ;
- tests.py ;
- views.py.
Il est nécessaire d'ajouter l'application helloworld à la liste des applications du projet idreammicro. Pour ce faire on édite le fichier settings.py et on ajoute l'application helloworld à la liste des applications installées :
INSTALLED_APPS = ( 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.sites', 'helloworld' )
Il est nécessaire de créer une vue. On édite le fichier helloworld/views.py. On y ajoute la vue index :
# Create your views here. from django.http import HttpResponse def index(request): return HttpResponse("Hello world! You're at the index.")
Il est nécessaire de faire pointer au moins une URL sur la vue index. Dans le fichier urls.py, on ajoute deux URLs pointant sur la vue index (lignes 10 et 11) :
from django.conf.urls.defaults import * # Uncomment the next two lines to enable the admin: # from django.contrib import admin # admin.autodiscover() urlpatterns = patterns('', # Example: # (r'^idreammicro/', include('idreammicro.foo.urls')), (r'^$', 'helloworld.views.index'), (r'^helloworld/$', 'helloworld.views.index'), # Uncomment the admin/doc line below and add 'django.contrib.admindocs' # to INSTALLED_APPS to enable admin documentation: # (r'^admin/doc/', include('django.contrib.admindocs.urls')), # Uncomment the next line to enable the admin: # (r'^admin/', include(admin.site.urls)), )
Ainsi les adresses http://127.0.0.1:8000 et http://127.0.0.1:8000/helloworld afficheront la même page d'index.
On relance le serveur de développement :
/var/www/idreammicro$ python manage.py runserver
On ouvre à nouveau la page http://127.0.0.1:8000 qui doit désormais afficher ceci :
Comme on vient de le vérifier avec le serveur de développement, le site Django idreammicro est désormais fonctionnel. Toutefois Django déconseille fortement d'utiliser le serveur de développement en production. C'est pourquoi cet article propose maintenant de servir le site idreammicro à l'aide d'Apache.
[Télécharger le projet idreammicro]
Servir le site idreammicro avec Apache 2
Application WSGI
Il est nécessaire de créer une application WSGI. Celle-ci sera contenue dans le fichier /var/www/idreammicro/apache/django.wsgi.
Dans le dossier du projet Django, on crée un dossier apache :
/var/www/idreammicro$ sudo mkdir apache
On crée un fichier django.wsgi dans le dossier précédemment créé et on y écrit le contenu suivant :
import os import sys path = '/var/www/' if path not in sys.path: sys.path.append(path) sys.path.append('/var/www/idreammicro/') os.environ['DJANGO_SETTINGS_MODULE'] = 'idreammicro.settings' import django.core.handlers.wsgi application = django.core.handlers.wsgi.WSGIHandler()
Création du VirtualHost
On crée un VirtualHost dédié dans le fichier /etc/apache2/sites-available/idreammicro :
<VirtualHost *:80> ServerName idreammicro DocumentRoot /var/www/idreammicro <Directory /var/www/idreammico> Order allow,deny Allow from all </Directory> WSGIDaemonProcess daemon user=www-data group=www-data processes=2 threads=15 display-name=%{GROUP} WSGIProcessGroup daemon WSGIScriptAlias / /var/www/idreammicro/apache/django.wsgi </VirtualHost>
On indique qu'Apache (utilisateur www-data, groupe www-data) est le propriétaire de l'application Django :
/var/www/idreammicro$ sudo chown -R www-data:www-data /var/www/idreammicro
On active le site idreammicro :
/var/www/idreammicro$ sudo a2ensite idreammicro
On recharge la configuration d'Apache :
/var/www/idreammicro$ sudo /etc/init.d/apache2 reload
Le VirtualHost Apache précédemment créé porte le nom idreammicro (ServerName idreammicro). Par conséquent il est nécessaire de créer une nouvelle association nom de machine / adresse IP. Dans le fichier /etc/hosts, on ajoute la ligne :
127.0.1.1 idreammicro
Vérification
On vérifie que le site idreammicro est bien servi par Apache en se connectant à l'adresse http://idreammicro. Si tout fonctionne correctement, la page correspondant à la vue index doit s'afficher.
[Télécharger le projet idreammicro]
Conclusion
Finalement, servir un site Django avec Apache n'est pas si compliqué, pour peu qu'on trouve la bonne méthode. Il est certainement possible de réaliser une configuration plus avancée, aussi bien concernant Apache que le module WSGI. Leurs sites respectifs sont des mines d'informations...
Références
- Writing your first Django app, part 1
- Writing your first Django app, part 3
- How to use Django with Apache and mod_wsgi
- Installing Django with Apache and mod_wsgi on Ubuntu 10.04