root/docs/trunk/modpython.txt

Revision 341, 16.2 kB (checked in by nicos, 2 years ago)

modpython -> 8015 & fastcgi -> 8076

Line 
1 =======================================
2 Comment utiliser Django avec mod_python
3 =======================================
4
5 Apache_ avec `mod_python`_ est actuellement la configuration recommandée pour
6 un serveur de production.
7
8 mod_python est similaire à `mod_perl`_ : Il embarque Python au sein d'Apache
9 et charge Python en mémoire lorsque le serveur démarre. Python reste en mémoire
10 tout le temps sans être lié aux process Apache, ce qui conduit à un gain de
11 performance sensible.
12
13 Django requiert Apache 2.x et mod_python 3.x, et vous devriez utiliser Apache
14 en mode `prefork MPM`_, et non pas en mode `worker MPM`_.
15
16 Vous pouvez aussi être intéressé par `Comment utilisez Django avec FastCGI,
17 SCGI ou AJP`_ (qui couvre aussi SCGI et AJP).
18
19 .. _Apache: http://httpd.apache.org/
20 .. _mod_python: http://www.modpython.org/
21 .. _mod_perl: http://perl.apache.org/
22 .. _prefork MPM: http://httpd.apache.org/docs/2.2/mod/prefork.html
23 .. _worker MPM: http://httpd.apache.org/docs/2.2/mod/worker.html
24 .. _Comment utilisez Django avec FastCGI, SCGI ou AJP: ../fastcgi/
25
26 Configuration basique
27 =====================
28
29 Pour configurer Django avec mod_python, assurez vous qu'Apache est installé,
30 et que mod_python est activé.
31
32 Ensuite éditez votre fichier ``httpd.conf`` et ajoutez-y ce qui suit::
33
34     <Location "/mysite/">
35         SetHandler python-program
36         PythonHandler django.core.handlers.modpython
37         SetEnv DJANGO_SETTINGS_MODULE mysite.settings
38         PythonOption django.root /mysite
39         PythonDebug On
40     </Location>
41
42 ...et remplacez ``mysite.settings`` par le nom du répertoire de votre projet Django
43 où se trouve votre fichier settings.py.
44
45 Cela indique à Apache : "Utilise mod_python pour toutes les URL sous le chemin
46 '/mysite/', en utilisant l'handler Django de mod_python." Cela lui fournit la
47 valeur définie pour ``DJANGO_SETTINGS_MODULE`` et ainsi, mod_python sait quels
48 paramÚtres utiliser.
49
50 **Nouveau dans la version de développement de Django :** Du fait que
51 mod_python ne sait pas que le site est affiché sous le chemin ``/mysite/``,
52 cette valeur doit être fournie au handler de mod_python via la ligne
53 ``PythonOption django.root ...``. La valeur donnée à cette ligne (le dernier
54 élément) doit correspondre à ce qui est indiqué dans la directive ``<Location
55 ...>```. Par conséquent, Django va automatiquement supprimer la chaine
56 ``/mysite`` du début de chaque url avant de les faire correspondre à vos
57 rÚgles de configuration d'url définies dans ``URLConf``. Si vous déplacez votre
58 site sous le chemin ``/mysite2``, vous n'aurez rien à faire excepté modifier
59 l'option ``django.root`` dans le fichier de configuration apache de votre site.
60
61 Lorsque vous utilisez l'option ``django.root``, assurez-vous que ce qui reste
62 aprÚs le préfix (ie /mysite) commence bien par un slash (/). Vos rÚgles de
63 configuration d'URL (URLConf) qui commencent par un slash fonctionneront
64 correctement. Dans l'exemple ci-dessus, puisque ``/mysite/admin/`` doit
65 renvoyer vers ``/admin/``, il nous suffit de supprimer la chaine ``/mysite``
66 de cette occurence puisqu'il s'agit de la valeur définie pour ``django.root``.
67 Utiliser ``/mysite/`` (avec un slash final), serait une erreur dans le cas
68 présent.
69
70 Notez que nous utilisons la directive ``<Location>`` et non ``<Directory>``.
71 Cette derniÚre est utilisée pour pointer sur des emplacements dans votre
72 systÚme de fichiers, alors que ``<Location>`` porte sur le motif de l'url de
73 votre site web. ``<Directory>`` n'a aucun sens ici.
74
75 En outre, si votre projet Django n'est pas dans le ``PYTHONPATH`` par défaut
76 de votre ordinateur, vous devez indiquer à mod_python où se situe le projet :
77
78 .. parsed-literal::
79
80     <Location "/mysite/">
81         SetHandler python-program
82         PythonHandler django.core.handlers.modpython
83         SetEnv DJANGO_SETTINGS_MODULE mysite.settings
84         PythonOption django.root /mysite
85         PythonDebug On
86         **PythonPath "['/path/to/project'] + sys.path"**
87     </Location>
88
89 La valeur que vous utilisez pour le ``PythonPath`` doit contenir tous les
90 répertoires parents des modules que vous importez dans votre application.
91 Elle doit aussi contenir le dossier parent de votre fichier
92 ``DJANGO_SETTINGS_MODULE``. Cela est en tout point similaire à la définition
93 du Python Path pour un usage interactif. A chaque fois que vous tentez
94 d'importer quelque chose, Python va regarder dans les répertoires de votre
95 ``sys.path``, du premier au dernier, puis va tenter d'importer le(s) module(s)
96 depuis chaque répertoire jusqu'au chargement effectif du module.
97
98 Un exemple pour éclaircir ces propos : Supposez que vous avez une application
99 située dans ``/usr/local/django-apps/`` (par exemple :
100 ``/usr/local/django-apps/weblog/``), que votre fichier de paramÚtres est
101 ``/var/www/mysite/settings.py`` et que vous avez défini
102 ``DJANGO_SETTINGS_MODULE`` comme dans l'exemple précédent.
103 Dans ce cas, vous allez définir votre directive ``PythonPath`` directive de la
104 façon suivante::
105
106     PythonPath "['/usr/local/django-apps/', '/var/www'] + sys.path"
107
108 Avec ce chemin, ``import weblog`` and ``import mysite.settings`` vont
109 fonctionner. Si vous avez ``import blogroll`` dans votre code et si
110 ``blogroll`` est située dans le répertoire ``weblog/``, alors vous devez
111 *également* ajouter ``/usr/local/django-apps/weblog/`` à votre directive
112 ``PythonPath``. Rappel: Le **répertoire parent** de tout ce que vous importez
113 doit être défini dans votre Python path.
114
115 .. note::
116
117     Si vous utilisez Windows, il est recommandé d'utiliser les "slashs"
118     dans la désignation du chemin, même si les "anti-slashs" sont utilisés
119     nativement. Apache sait comment convertir les slashs en anti-slashs.
120     En procédant ainsi, votre configuration est portable sur un autre
121     environnement et gagne en lisibilité (cela évite surtout d'échapper vos
122     anti-slashs).   
123
124     Ceci est valide même sous un systÚme Windows::
125
126         PythonPath "['c:/path/to/project'] + sys.path"
127        
128 Vous pouvez aussi ajouter des directives telles que ``PythonAutoReload Off``
129 pour améliorer les performances. Référez vous à la
130 `documentation de mod_python`_ pour la liste complÚte des options.
131
132 Notez que vous devez utiliser ``PythonDebug Off`` sur un serveur de
133 production. Si vous avez ``PythonDebug On``, vos utilisateurs vont voir les
134 tracebacks Python hideux et révélateur en cas d'erreurs avec mod_python.
135
136 Redémarrez Apache, et toutes les requêtes vers /mysite/ seront servies par
137 Django. Note que la configuration des urls de Django n'analyse pas "/mysite/"
138 -- c'est bien toute l'url qui lui est passé.
139
140 Quand vous déployez des sites réalisés avec Django avec mod_python, vous
141 devrez redémarrez Apache à chaque fois que vous modifiez votre code Python.
142
143 Installations multiples de Django au sein d'une seule instance Apache
144 =====================================================================
145
146 Il est tout à fait possible d'exécuter plusieurs instances de Django sur la
147 même instance Apache. Il faut juste utiliser les `VirtualHost`` comme indiqué
148 ci-dessous ::
149
150     NameVirtualHost *
151
152     <VirtualHost *>
153         ServerName www.example.com
154         # ...
155         SetEnv DJANGO_SETTINGS_MODULE mysite.settings
156     </VirtualHost>
157
158     <VirtualHost *>
159         ServerName www2.example.com
160         # ...
161         SetEnv DJANGO_SETTINGS_MODULE mysite.other_settings
162     </VirtualHost>
163
164 Si vous avez besoin d'utiliser plusieurs instances au sein du même
165 ``VirtualHost``, vous devez vous assurer que le cache de mod_python n'ait pas
166 d'effets de bord.  Utiliser la directive ``PythonInterpreter`` au sein de
167 chaque section ``<Location>`` pour contourner le problÚme::
168
169     <VirtualHost *>
170         ServerName www.example.com
171         # ...
172         <Location "/something">
173             SetEnv DJANGO_SETTINGS_MODULE mysite.settings
174             PythonInterpreter mysite
175         </Location>
176
177         <Location "/otherthing">
178             SetEnv DJANGO_SETTINGS_MODULE mysite.other_settings
179             PythonInterpreter othersite
180         </Location>
181     </VirtualHost>
182
183 Les valeurs données à ``PythonInterpreter`` importent peu tant qu'elles sont
184 différentes pour chaque section ``Location``.
185
186 Mettre en place un serveur de développement avec mod_python
187 ===========================================================
188
189 Si vous utilisez mod_python en tant que serveur de développement, vous pouvez
190 éviter la contrainte de redémarrer le serveur à chaque modification de code.
191 Il vous suffit de définir ``MaxRequestsPerChild 1`` dans votre fichier
192 ``httpd.conf`` pour forcer Apache à se recharger à chaque requête. Mais ne
193 faites surtout pas ça sur un serveur de production, faute de quoi nous vous
194 interdirions de jouer avec Django.
195
196 Si vous êtes le genre de programmeur à débugguer en utilisant des instructions
197 ``print``, notez que l'instruction ``print`` n'a aucun effet sous mod_python ;
198 Elle n'apparaît pas dans le log d'apache comme certains s'y attendent. Si vous
199 avez besoin d'afficher les informations de débuggage sous mod_python, utilisez
200 plutÃŽt ::
201
202     assert False, the_value_i_want_to_see
203
204 Ou ajoutez les informations de débuggage dans votre modÚle de page.
205
206 .. _documentation de mod_python: http://modpython.org/live/current/doc-html/directives.html
207
208 Servir les fichiers média
209 =========================
210
211 Django ne sert pas de lui-même les fichiers media. Il laisse cette tâche au
212 serveur web que vous avez choisi.
213
214 Nous recommandons l'utilisation d'un serveur web distinct, i.e. un qui soit
215 différent de celui sur lequel tourne Django, pour servir les fichiers media.
216 Ci-aprÚs quelques bons choix :
217
218 * lighttpd_
219 * TUX_
220 * Une version allégée d'Apache_
221
222 Si, toutefois, vous n'avez pas cette possibilité et devez servir les fichiers
223 media sur le même hÎte virtuel Apache, voici comment désactivez mod_python
224 pour une partie du site ::
225
226     <Location "/media/">
227         SetHandler None
228     </Location>
229
230 Adaptez ``Location`` en fonction de l'url racine de vos fichiers media. Vous
231 pouvez aussi utiliser la directive ``<LocationMatch>`` pour satisfaire une
232 expression réguliÚre.
233
234 L'exemple suivant définit que Django est à la racine du site mais le désactive
235 pour le dossier ``media`` et toute url se terminant par ``.jpg``, ``.gif`` ou
236 ``.png``::
237
238     <Location "/">
239         SetHandler python-program
240         PythonHandler django.core.handlers.modpython
241         SetEnv DJANGO_SETTINGS_MODULE mysite.settings
242     </Location>
243
244     <Location "media">
245         SetHandler None
246     </Location>
247
248     <LocationMatch "\.(jpg|gif|png)$">
249         SetHandler None
250     </LocationMatch>
251
252
253 .. _lighttpd: http://www.lighttpd.net/
254 .. _TUX: http://en.wikipedia.org/wiki/TUX_web_server
255 .. _Apache: http://httpd.apache.org/
256
257 Servir les fichiers media d'admin
258 =================================
259
260 Notez que le serveur de développement de Django sert automatiquement les
261 fichiers media d'admin mais ce n'est plus le cas si vous utilisez une autre
262 configuration. Vous devez configurer Apache, ou tout autre serveur web
263 utilisé, pour servir les fichiers d'admin.
264
265 Les fichiers d'admin sont situés dans (``django/contrib/admin/media``) dans la
266 distribution de Django.
267
268 Ci-aprÚs les deux approches recommandées :
269
270     1. Créer un lien symbolique vers les fichiers media d'admin depuis la
271        racine de votre site. Ainsi, tous les fichiers dépendants de Django
272        (code **et** modÚles) demeurent à un seul endroit,   et vous serez
273        toujours en mesure de mettre à jour votre code vers les derniers
274        gabarits d'admin via ``svn update``, si ces gabarits changent.
275     2. Ou copiez les fichiers media d'admin de telle sorte qu'ils soient
276        présents à la racine de votre site.
277
278 Utiliser des eggs avec mod_python
279 =================================
280
281 Si vous avez installé Django à partir d'un egg_ ou si vous utilisez des eggs
282 dans votre projet Django, une opération supplémentaire est requise. Créez un
283 fichier dans votre projet (ou ailleurs) contenant les éléments suivants::
284
285     import os
286     os.environ['PYTHON_EGG_CACHE'] = '/some/directory'
287
288 Ici, ``/some/directory`` est un répertoire dans lequel Apache doit pouvoir
289 écrire. Les eggs vont utiliser ce répertoire pour y placer tout le code
290 nécessaire à leur fonctionnement
291
292 Ensuite, vous devez indiquer à mod_python qu'il lui faut importer ce fichier
293 avant de faire quoi que ce soit. Cela se fait en utilisant la directive
294 PythonImport_ de mod_python. Vous devez vous assurer que vous avez bien défini
295 la directive ``PythonInterpreter`` pour mod_python comme décrit précédemment__ 
296 (vous devez faire cela même si vous n'utilisez pas les installations multiples).
297
298 Ensuite, ajoutez la ligne ``PythonImport`` dans le fichier de configuration
299 principal de votre serveur (c'est à dire en dehors des sections ``Location``
300 ou ``VirtualHost``). Par exemple::
301
302     PythonInterpreter my_django
303     PythonImport /path/to/my/project/file.py my_django
304
305 Note : vous pouvez utiliser un chemin absolu (ou un chemin d'import normal,
306 marqué par des points), comme décrit dans le `manuel de mod_python`_. Nous
307 utilisons un chemin absolu dans l'exemple ci-dessus, car, si n'importe quelle
308 modification du path python est requise pour accéder à votre projet, elle ne
309 sera pas effectuée lorsque la ligne ``PythonImport`` est interprétée.
310
311 .. _egg: http://peak.telecommunity.com/DevCenter/PythonEggs
312 .. _PythonImport: http://www.modpython.org/live/current/doc-html/dir-other-pimp.html
313 .. _manuel de mod_python: PythonImport_
314 __ `Installations multiples de Django au sein d'une seule instance Apache`_
315
316 Gestion des erreurs
317 ===================
318
319 Quand vous utilisez Apache/mod_python, les erreurs seront attrapées par Django
320  -- en d'autres mots elles ne seront pas remontées à Apache et n'apparaîtront
321  pas dans le fichier ``error_log`` de ce dernier.
322
323 La seule exception est que si quelque chose de vraiment étrange est présent
324 dans la configuration de votre instance Django. Dans ce cas, vous verrez une
325 page "Internal Server Error" dans votre navigateur et le traceback python
326 complet dans le fichier ``error_log`` d'Apache. Le "traceback" dans le
327 ``error_log`` est réparti sur plusieurs linges. (Oui, c'est moche et plus
328 complexe à lire mais c'est la façon dont mod_python
329 gÚre les choses.)
330
331 Si vous obtenez une erreur de segmentation (segmentation fault)
332 ===============================================================
333
334 Si Apache provoque une erreur de segmentation, il y a deux causes probables
335 qui ne sont pas imputables à Django.
336
337     1. Cela est peut être dû à votre code python qui importe le module
338        "pyexpat", qui peut rentrer en conflit avec la version embarquée dans
339        Apache. Pour plus d'information, consultez `Expat Causing Apache Crash`_.
340     2. Cela peut être du au fait que vous faites tourner mod_python et mod_php
341        dans la même instance d'apache avec MySQL comme base de données. Dans
342        certains cas, cela cause une erreur connue de mod_python due à un
343        conflit de version entre le backend Python et PHP de MySQL. Plus
344        d'information dans l'`entrée de la FAQ de mod_python`_. 
345        
346 Si les problÚmes persistent dans votre mise en place de mod_python, une bonne
347 chose à faire est de tester un site sous mod_python et qui n'a pas été réalisé
348 avec le framework Django. Il s'agit d'un moyen simple pour isoler les
349 problÚmes spécifiques à mod_python. La page `Getting mod_python Working`_
350 détaille cette procédure.
351
352 L'étape suivante serait d'éditer votre code de test et d'importer ajouter
353 n'importe quel bout de code spécifique Django que vous utiliser -- vos vues,
354 modÚles, configuration d'url, configuration RSS, etc. Mettez ces bouts de code
355 importer dans votre function de test au sein de votre handler et accédez-y
356 avec votre navigateur. Si cela conduit à un crash, vous venez de confirmer que
357 c'est le code Django importé qui pose problÚme. Réduisez progressivement la
358 taille du code importé jusqu'à ce que le crash n'ait plus lieu afin de trouver
359 le module qui pose problÚme. Plonger dans les modules et les modules importés
360 xsdepuis ces premiers modules si nécessaire.
361
362 .. _Expat Causing Apache Crash: http://www.dscpl.com.au/articles/modpython-006.html
363 .. _entrée de la FAQ de mod_python: http://modpython.org/FAQ/faqw.py?req=show&file=faq02.013.htp
364 .. _Getting mod_python Working: http://www.dscpl.com.au/articles/modpython-001.html
Note: See TracBrowser for help on using the browser.