Comment déployer avec WSGI

La plate-forme principale de déploiement Django est WSGI, le standard Python pour les serveurs et applications Web.

La commande de gestion startproject de Django définit par défaut une configuration WSGI simple pour vous, que vous pouvez ensuite adapter aux besoins de votre projet ; cette configuration est alors utilisable par tout serveur Web se conformant au standard WSGI. Django contient de la documentation sommaire pour les serveurs WSGI suivants :

L’objet application

Un concept-clé dans le déploiement avec WSGI est de définir un objet exécutable application central que le serveur Web utilise pour communiquer avec votre code. Ceci est généralement spécifié par un objet nommé application dans un module Python accessible par le serveur.

Changed in Django 1.4.

La commande startproject crée un fichier nomprojet/wsgi.py qui contient l’objet exécutable application.

Note

Si vous mettez à jour Django depuis une version précédente et que vous n’avez pas de fichier wsgi.py dans votre projet, vous pouvez simplement en ajouter un au même niveau que le paquet Python de premier niveau de votre projet (probablement en compagnie de settings.py et urls.py), en y incluant le contenu ci-dessous. Si vous voulez que runserver utilise également ce fichier WSGI, vous pouvez aussi ajouter WSGI_APPLICATION = "monsite.wsgi.application" dans vos réglages (en remplaçant monsite par le nom de votre projet).

Initialement, ce fichier contient :

import os

os.environ.setdefault("DJANGO_SETTINGS_MODULE", "mysite.settings")

# This application object is used by the development server
# as well as any WSGI server configured to use this file.
from django.core.wsgi import get_wsgi_application
application = get_wsgi_application()

La ligne os.environ.setdefault ne fait que définir le module settings à utiliser par défaut, si vous n’avez pas explicitement défini la variable d’environnement DJANGO_SETTINGS_MODULE. Vous devrez éditer cette ligne pour remplacer mysite par le nom du paquet de votre projet, afin que le chemin vers votre module settings soit correct.

Pour appliquer un middleware WSGI, vous pouvez simplement encapsuler l’objet application dans le même fichier :

from helloworld.wsgi import HelloWorldApplication
application = HelloWorldApplication(application)

Vous pourriez aussi remplacer l’application WSGI de Django avec une application WSGI personnalisée qui défère l’application WSGI de Django à plus tard, dans le cas où vous souhaitez combiner une application Django avec une application WSGI d’un autre système applicatif.

Note

Certains middlewares WSGI de tierce partie n’appellent pas close sur la réponse après avoir traité une requête, notamment le middleware de signalement d’erreurs de Sentry jusqu’à la version 2.0.7. Dans ces cas, le signal request_finished n’est pas envoyé. Par conséquent, il se peut que des connexions de base de données et de serveurs memcache puissent être laissées ouvertes.