Création du projet et de l'application
On choisit arbitrairement de travailler dans le dossier /home/jlesech/www-django. À chacun de l'adapter en fonction de son environnement.
On crée un projet nommé idreammicro.
django-admin.py startproject idreammicro
On se place dans le dossier du projet. Tous les chemins cités dans la suite de cet article seront relatifs à cet emplacement..
cd idreammicro
Puis on crée une application nommée helloworld.
django-admin.py startapp helloworld
Il en résulte l'arborescence suivante, introduite avec Django 1.4.
idreammicro |_ helloworld | |_ __init__.py | |_ models.py | |_ tests.py | |_ views.py |_ idreammicro | |_ __init.py__ | |_ settings.py | |_ urls.py | |_ wsgi.py |_ manage.py
Support WSGI
Django 1.4 a introduit une amélioration du support WSGI, en embarquant une application WSGI dans le fichier idreammicro/wsgi.py.
""" WSGI config for idreammicro project. This module contains the WSGI application used by Django's development server and any production WSGI deployments. It should expose a module-level variable named ``application``. Django's ``runserver`` and ``runfcgi`` commands discover this application via the ``WSGI_APPLICATION`` setting. Usually you will have the standard Django WSGI application here, but it also might make sense to replace the whole Django WSGI application with a custom one that later delegates to the Django one. For example, you could introduce WSGI middleware here, or combine a Django application with an application of another framework. """ import os # We defer to a DJANGO_SETTINGS_MODULE already in the environment. This breaks # if running multiple sites in the same mod_wsgi process. To fix this, use # mod_wsgi daemon mode with each site in its own daemon process, or use # os.environ["DJANGO_SETTINGS_MODULE"] = "idreammicro.settings" os.environ.setdefault("DJANGO_SETTINGS_MODULE", "idreammicro.settings") # This application object is used by any WSGI server configured to use this # file. This includes Django's development server, if the WSGI_APPLICATION # setting points here. from django.core.wsgi import get_wsgi_application application = get_wsgi_application() # Apply WSGI middleware here. # from helloworld.wsgi import HelloWorldApplication # application = HelloWorldApplication(application)
Activation de l'application
Dans le fichier idreammicro/settings.py, on active l'application helloworld (ligne 127).
INSTALLED_APPS = ( 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.sites', 'django.contrib.messages', 'django.contrib.staticfiles', # Uncomment the next line to enable the admin: # 'django.contrib.admin', # Uncomment the next line to enable admin documentation: # 'django.contrib.admindocs', 'helloworld', )
Vue
Dans le fichier helloworld/views.py, on crée la vue index.
from django.http import HttpResponse def index(request): return HttpResponse("Hello world!")
Celle-ci se veut la plus simple possible et affiche un simple Hello world!.
Urls
On crée le fichier helloworld/urls.py, on configure l'url de la vue index précédemment créée.
from django.conf.urls import patterns, url from helloworld import views urlpatterns = patterns('', url(r'^$', views.index, name='index') )
Dans le fichier idreammicro/urls.py, on inclut le fichier contenant les urls de l'application helloworld.
from django.conf.urls import patterns, include, url # Uncomment the next two lines to enable the admin: # from django.contrib import admin # admin.autodiscover() urlpatterns = patterns('', # Examples: # url(r'^$', 'idreammicro.views.home', name='home'), # url(r'^idreammicro/', include('idreammicro.foo.urls')), # Uncomment the admin/doc line below to enable admin documentation: # url(r'^admin/doc/', include('django.contrib.admindocs.urls')), # Uncomment the next line to enable the admin: # url(r'^admin/', include(admin.site.urls)), url(r'^helloworld/', include('helloworld.urls')), )
Afin de vérifier que le projet et l'application sont fonctionnels, on lance le serveur de développement.
python manage.py runserver
Dans un navigateur, on saisit l'adresse http://localhost:8000/helloworld.
Magnifique ! Le projet et l'application fonctionnent. On peut maintenant passer aux choses sérieuses et les servir à l'aide d'Apache.
Virtual Host Apache
On choisit de créer un serveur virtuel dédié au projet Django. Les opérations suivantes nécessitent d'avoir les droits d'administration.
On crée le fichier /etc/apache2/sites-available/idreammicro.
<VirtualHost *:80> ServerName django ServerAlias django DocumentRoot /home/jlesech/www-django/idreammicro <Directory /home/jlesech/www-django/idreammicro> Order allow,deny Allow from all </Directory> WSGIDaemonProcess django processes=2 threads=15 display-name=%{GROUP} python-path=/home/jlesech/www-django/idreammicro WSGIProcessGroup django WSGIScriptAlias / /home/jlesech/www-django/idreammicro/idreammicro/wsgi.py <Directory /home/jlesech/www-django/idreammicro/idreammicro> Order allow,deny Allow from all </Directory> ErrorLog ${APACHE_LOG_DIR}/idreammicro_error.log # Possible values include: debug, info, notice, warn, error, crit, # alert, emerg. LogLevel warn CustomLog ${APACHE_LOG_DIR}/idreammicro_access.log combined </VirtualHost>
On active le nouveau serveur virtuel.
a2ensite idreammicro
Dans le fichier /etc/hosts, on ajoute un host (ligne 3).
127.0.0.1 localhost 127.0.1.1 i7 127.0.0.1 django # The following lines are desirable for IPv6 capable hosts ::1 ip6-localhost ip6-loopback fe00::0 ip6-localnet ff00::0 ip6-mcastprefix ff02::1 ip6-allnodes ff02::2 ip6-allrouters
Dans un navigateur, on saisit l'adresse http://django/helloworld.
Conclusion
Comme l'avait montré le précédent article, servir un projet Django avec Apache et le module WSGI était déjà relativement simple. C'est encore plus simple aujourd'hui !
Par rapport à Django 1.3, Django 1.4 et ses versions supérieures nous épargnent la création de l'application WSGI. Ainsi on se concentre sur la partie spécifique à chaque serveur, en l'occurrence la création d'un serveur virtuel Apache dédié au projet Django.
Références
- Django Documentation - How to deploy with WSGI
- Django Documentation - How to use Django with Apache and mod_wsgi
- Quick configuration guide for mod_wsgi