root/docs/trunk/request_response.txt

Revision 327, 26.0 kB (checked in by david, 7 months ago)

Corrections typos request response

Line 
1 =============================
2 Les objets requête et réponse
3 =============================
4
5 Rapide survol
6 =============
7
8 Django utilise les objets requête et réponse pour fournir l'état au systÚme.
9
10 Quand une page est demandée, Django crée un objet ``HttpRequest`` qui contient
11 des métadonnées relatives à la requête. Puis, Django charge la vue appropriée en
12 lui passant l'``HttpRequest`` en premier argument de la fonction de vue. Chaque
13 vue est chargée de retourner un objet ``HttpResponse``.
14
15 Ce document détaille les APIs des objets ``HttpRequest`` et ``HttpResponse``.
16
17 Objets HttpRequest
18 ==================
19
20 Attributs
21 ---------
22
23 Tous les attributs en dehors de ``session`` doivent être considérés en lecture
24 seule.
25
26 ``path``
27     Une chaîne de caractÚres représentant le chemin complet de la page demandée,
28     n'incluant pas le domaine.
29
30     Exemple: ``"/musique/groupes/the_beatles/"``
31
32 ``method``
33     Une chaîne de caractÚres représentant la méthode HTTP utilisée dans la
34     requête. Elle est garantie en majuscules. Exemple::
35
36         if request.method == 'GET':
37             faire_quelque_chose()
38         elif request.method == 'POST':
39             faire_quelque_chose_d_autre()
40
41 ``encoding``
42     **Nouveau dans la version de développement de Django**
43     Une chaîne de caractÚres spécifiant l'encodage courant utilisé pour décoder
44     les données soumises par le formulaire (ou ``None``, signifiant que le
45     paramÚtre ``DEFAULT_CHARSET`` est utilisé). Vous pouvez modifier cet
46     attribut pour changer l'encodage utilisé lorsque vous accédez aux données
47     de formulaire. Tout appel à un attribut subséquent (tel que la lecture de
48     ``GET`` ou ``POST``) utilisera la nouvelle valeur ``encoding``. Utile si
49     vous savez que les données de formulaire n'ont pas le même encodage que
50     celui défini par ``DEFAULT_CHARSET``.
51
52 ``GET``
53     Un objet pseudo-dictionnaire contenant tous les paramÚtres HTTP GET donnés.
54     Voir la documentation de ``QueryDict`` ci-dessous.
55
56 ``POST``
57     Un objet pseudo-dictionnaire contenant tous les paramÚtres HTTP POST donnés.
58     Voir la documentation de ``QueryDict`` ci-dessous.
59    
60     Il est possible qu'une requête puisse parvenir en POST avec un dictionnaire
61     ``POST`` vide -- si, imaginons, un formulaire est transmis via la méthode
62     HTTP POST mais sans inclure de donnée de formulaire. En conséquence, vous ne
63     devriez pas utiliser ``if request.POST`` pour vérifier l'utilisation de la
64     méthode POST; utilisez, à la place, ``if request.method == "POST"`` (voir
65     plus haut).
66    
67     Note: ``POST`` n'inclue *pas* d'informations sur le transfert de fichier.
68     Voir ``FILES``.
69
70 ``REQUEST``
71     Par commodité, un objet pseudo-dictionnaire recherchant d'abord dans ``POST``
72     puis dans ``GET``. Inspiré par le ``$_REQUEST`` de PHP.
73    
74     Par exemple, si ``GET = {"name": "john"}`` et ``POST = {"age": '34'}``,
75     ``REQUEST["name"]`` vaudrait ``"john"``, et ``REQUEST["age"]`` vaudrait
76     ``"34"``.
77
78     Il est hautement recommandé d'utiliser ``GET`` et ``POST`` au lieu de
79     ``REQUEST``, car les premiers sont plus explicites.
80
81 ``COOKIES``
82     Un dictionnaire Python standard contenant tous les cookies. Les clés et les
83     valeurs sont des chaînes de caractÚres.
84
85 ``FILES``
86     Un objet pseudo-dictionnaire contenant tous les fichiers transférés. Chaque
87     clé de ``FILES`` est la propriété ``name`` de
88     ``<input type="file" name="" />``. Chaque valeur de ``FILES`` est un
89     dictionnaire Python standard contenant les trois clés suivantes:
90
91         * ``filename`` -- Le nom du fichier transféré, en tant que chaîne de
92           caractÚres Python.
93         * ``content-type`` -- Le type de contenu du fichier transféré.
94         * ``content`` -- Le contenu brut du fichier transféré.
95
96     Notez que ``FILES`` ne contiendra des données que si la méthode de transfert
97     est POST et que le ``<form>`` qui a envoyé les données possÚde un
98     ``enctype="multipart/form-data"``. Sans quoi, ``FILES`` sera un objet
99     pseudo-dictionnaire vide.
100
101 ``META``
102     Un dictionnaire Python standard contenant tous les entêtes HTTP disponible.
103     Les entêtes disponibles dépendent du client et du serveur, mais voici
104     quelques exemples:
105
106         * ``CONTENT_LENGTH``
107         * ``CONTENT_TYPE``
108         * ``HTTP_ACCEPT_ENCODING``
109         * ``HTTP_ACCEPT_LANGUAGE``
110         * ``HTTP_HOST`` -- L'entête HTTP Host envoyé par le client.
111         * ``HTTP_REFERER`` -- La page référant, si elle existe.
112         * ``HTTP_USER_AGENT`` -- L'agent-utilisateur du client (chaîne de
113           caractÚres).
114         * ``QUERY_STRING`` --  La chaîne de recherche, une unique chaîne de
115           caractÚres (non analysée).
116         * ``REMOTE_ADDR`` -- L'adresse IP du client.
117         * ``REMOTE_HOST`` -- Le nom d'hÃŽte du client.
118         * ``REQUEST_METHOD`` -- Une chaîne de caractÚres telle que ``"GET"`` ou
119           ``"POST"``.
120         * ``SERVER_NAME`` -- Le nom d'hÃŽte du serveur.
121         * ``SERVER_PORT`` -- Le numéro de port du serveur.
122
123 ``user``
124     Un objet ``django.contrib.auth.models.User`` représentant l'utilisateur
125     actuellement connecté. Si l'utilisateur n'est pas connecté, ``user`` sera
126     une instance de ``django.contrib.auth.models.AnonymousUser``. Vous pourrez
127     faire la distinction via ``is_authenticated()``, comme suit::
128
129         if request.user.is_authenticated():
130             # Faire quelquechose avec l'utilisateur connecté.
131         else:
132             # Faire quelquechose pour les utilisateurs anonymes.
133
134     ``user`` est disponible seulement si votre installation Django contient l'
135     ``AuthenticationMiddleware`` activé. Pour en en savoir plus, voir l'
136     `Authentification au travers des requêtes web`_.
137    
138     .. _Authentification au travers des requêtes web: ../authentication/#authentication-in-web-requests
139
140 ``session``
141     Un objet pseudo-dictionnaire en lecture et écriture représentant la session
142     courante. Disponible uniquement si votre installation de Django à le support
143     des sessions activé. Voir la `documentation sur la session`_ pour plus de
144     détails.
145
146     .. _`documentation sur la session`: ../sessions/
147
148 ``raw_post_data``
149     Les données HTTP POST brutes. Utile pour le traitement avancé. Utilisez
150     ``POST`` à la place.
151
152 Méthodes
153 --------
154
155 ``__getitem__(key)``
156    Retourne la valeur GET/POST pour la clé donnée, vérifiant POST en premier,
157    puis GET. LÚve une erreur ``KeyError`` si la clé n'existe pas.
158
159    Ceci vous permet d'utiliser une syntaxe d'accÚs aux données de type
160    dictionnaire sur une instance ``HttpRequest``. Exemple : ``request["foo"]``
161    retournerait ``True`` si l'un des ``request.POST`` ou ``request.GET`` possÚde
162    ``"foo"`` en clé.
163
164 ``has_key()``
165    Retourne ``True`` ou ``False``, vérifiant si ``request.GET`` ou
166    ``request.POST`` possÚde la clé donnée.
167
168 ``get_host()``
169    **Nouveau dans la version de développement de Django**
170
171    Retourne l'hÃŽte d'origine de la requête en utilisant les informations des
172    entêtes ``HTTP_X_FORWARDED_HOST`` et ``HTTP_HOST`` (dans cet ordre). S'ils ne
173    fournissent aucune valeur, la méthode utilise une combinaison du
174    ``SERVER_NAME`` et du ``SERVER_PORT`` comme détaillé dans le `PEP 333`_.
175
176    .. _PEP 333: http://www.python.org/dev/peps/pep-0333/
177
178    Exemple: ``"127.0.0.1:8000"``
179
180 ``get_full_path()``
181    Retourne le ``path``, plus l'ajout d'une chaîne de requête, si applicable.
182
183    Exemple: ``"/musique/groupes/les_beatles/?imprimer=true"``
184
185 ``build_absolute_uri(adresse)``
186    **Nouveau dans la version de développement de Django**
187
188    Retourne l'URI absolue de l'``adresse``. Si aucune adresse n'est fourni,
189    l'adresse sera définie par ``request.get_full_path()``.
190
191    Si l'adresse est déjà une URI absolue, elle restera inchangée. Sinon, l'URI
192    absolue est construite à partir des variables serveur définies dans la
193    requête.
194
195    Exemple: ``"http://exemple.com/musique/groupes/les_beatles/?imprimer=true"``
196
197 ``is_secure()``
198    Retourne ``True`` si la requête est sécurisée; c'est-à-dire, si elle est
199    effectuée avec HTTPS.
200
201 Objets QueryDict
202 ----------------
203
204 Dans un objet ``HttpRequest``, les attributs ``GET`` et ``POST`` sont des
205 instances de ``django.http.QueryDict``. ``QueryDict`` est une classe
206 pseudo-dictionnaire modifiée pour gérer les valeurs multiples d'une même clé.
207 Ceci est nécessaire du fait que certains éléments de formulaire HTML, notamment
208 ``<select multiple="multiple">``, passent plusieurs valeurs pour la même clé.
209
210 Les instances ``QueryDict`` sont immuables, à moins d'en créer une ``copy()``.
211 C'est-à-dire que vous ne pouvez pas changer les attributs de ``request.POST`` et
212 ``request.GET`` directement.
213
214 ``QueryDict`` implémente la totalité des méthodes dictionnaire standards,
215 puisqu'il s'agit d'une sous-classe de dictionnaire. Les exceptions sont
216 présentées ci-dessous:
217
218     * ``__getitem__(key)`` -- Retourne la valeur de la clé donnée. Si la clé
219       possÚde plus d'une valeur, ``__getitem__()`` retourne la derniÚre valeur.
220       LÚve ``django.utils.datastructure.MultiValueDictKeyError`` si la clé
221       n'existe pas. (C'est une sous-classe de la classe Python standard
222       ``KeyError``, vous pouvez donc vous contentez d'attraper une
223       ``KeyError``.)
224
225     * ``__setitem__(key, value)`` -- Assigne ``[value]`` (une liste Python dont
226       le seul élément est ``value``) à la clé donnée. Notez que celle-ci, comme
227       d'autres fonctions dictionnaires possédant des effets de bord, peut
228       seulement être appelée sur un ``QueryDict`` mutable (pouvant être créé
229       via ``copy()``).
230
231     * ``__contains__(key)`` -- Retourne ``True`` si la clé donnée est assignée.
232       Ceci vous permet de faire, e.g., ``if "foo" in request.GET``.
233
234     * ``get(key, default)`` -- Utilise la même logique que ``__getitem__()``
235       ci-dessus, modulo le renvoi d'une valeur par défaut si la clé n'existe
236       pas.
237
238     * ``has_key(key)``
239
240     * ``setdefault(key, default)`` -- Identique à la méthode de dictionnaire
241       standard ``setdefault()``, sauf qu'elle utilise ``__setitem__`` en
242       interne.
243
244     * ``update(other_dict)`` -- Prend en paramÚtre aussi bien un ``QueryDict``
245       qu'un dictionnaire standard. Identique à la méthode de dictionnaire
246       standard ``update()``, sauf qu'elle *ajoute* les éléments au dictionnaire
247       courant au lieu de les remplacer. Par exemple::
248          
249           >>> q = QueryDict('a=1')
250           >>> q = q.copy() # pour le rendre mutable
251           >>> q.update({'a': '2'})
252           >>> q.getlist('a')
253           ['1', '2']
254           >>> q['a'] # retourne la derniÚre valeur
255           ['2']
256
257     * ``items()`` -- Identique à la méthode de dictionnaire standard ``items()``,
258       sauf qu'elle utilise la même logique de derniÚre valeur que
259       ``__getitem()__``. Par exemple::
260
261            >>> q = QueryDict('a=1&a=2&a=3')
262            >>> q.items()
263            [('a', '3')]
264
265     * ``values()`` -- Identique à la méthode de dictionnaire standard
266       ``values()``, sauf qu'elle utilise la même logique de derniÚre valeur que
267       ``__getitem()__``. Par exemple::
268
269            >>> q = QueryDict('a=1&a=2&a=3')
270            >>> q.values()
271            ['3']
272
273 En outre, ``QueryDict`` possÚde les méthodes suivantes:
274
275     * ``copy()`` -- Retourne une copie de l'objet, utilisant ``copy.deepcopy()``
276       de la bibliothÚque standard Python. La copie sera mutable -- c'est-à-dire,
277       que vous pouvez changer ses valeurs.
278
279     * ``getlist(key)`` -- Retourne les données de la clé donnée, en tant que
280       liste Python. Retourne une liste vide si la clé n'existe pas. Il est
281       garantie qu'une liste soit retournée quoiqu'il arrive..
282
283     * ``setlist(key, list_)`` -- Assigne la clé donnée à la ``list_``
284       (contrairement à ``__setitem__()``).
285
286     * ``appendlist(key, item)`` -- Ajoute un élément à la liste interne associée
287       à une clé.
288
289     * ``setlistdefault(key, default_list)`` -- Identique à ``setdefault``,
290       sauf qu'elle prend une liste de valeurs au lieu d'une seule valeur.
291
292     * ```lists()`` -- Identique à ``items()``, sauf qu'elle inclue toutes les
293       valeurs, en tant que liste, pour chaque élément du dictionnaire.
294       Par exemple::
295
296            >>> q = QueryDict('a=1&a=2&a=3')
297            >>> q.lists()
298            [('a', ['1', '2', '3'])]
299
300     * ``urlencode()`` -- Retourne une chaîne de caractÚres issue des données
301       sous forme d'une chaîne de requête.
302       Exemple: ``"a=2&b=3&b=5"``.
303
304 Exemples
305 --------
306
307 Voici un exemple de formulaire HTML et comment Django traite les données reçues::
308
309     <form action="/foo/bar/" method="post">
310     <input type="text" name="votre_nom" />
311     <select multiple="multiple" name="groupes">
312         <option value="beatles">The Beatles</option>
313         <option value="who">The Who</option>
314         <option value="zombies">The Zombies</option>
315     </select>
316     <input type="submit" />
317     </form>
318
319 Si l'utilisateur entre ``"John Smith"`` dans le champ ``votre_nom`` et
320 sélectionne "The Beatles" et "The Zombies" dans le champ de sélection multiple,
321 voici à quoi l'objet requête de Django ressemblera::
322
323     >>> request.GET
324     {}
325     >>> request.POST
326     {'votre_nom': ['John Smith'], 'groupes': ['beatles', 'zombies']}
327     >>> request.POST['votre_nom']
328     'John Smith'
329     >>> request.POST['groupes']
330     'zombies'
331     >>> request.POST.getlist('groupes')
332     ['beatles', 'zombies']
333     >>> request.POST.get('votre_nom', 'Adrian')
334     'John Smith'
335     >>> request.POST.get('champ_inexistant', 'Perdu mon ami ?')
336     'Perdu mon ami ?'
337
338 Notes sur l'implementation
339 --------------------------
340
341 Les attributs ``GET``, ``POST``, ``COOKIES``, ``FILES``, ``META``, ``REQUEST``,
342 ``raw_post_data`` et ``user`` sont tous chargés au minimun. C'est-à-dire que
343 Django ne dépense aucune ressource pour calculer les valeurs de ces attributs
344 tant que votre code ne les utilise pas.
345
346 Les objets HttpResponse
347 =======================
348
349 Contrairement aux objets ``HttpRequest``, créés automatiquement par Django, les
350 objets ``HttpResponse`` sont de votre ressort. Chaque vue que vous écrivez est
351 responsable de l'instanciation, la définition et le retour d'un
352 ``HttpResponse``.
353
354 La classe ``HttpResponse`` réside dans le module ``django.http``.
355
356 Utilisation
357 -----------
358
359 Passage de chaîne de caractÚres
360 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
361
362 L'utilisation typique est de passer le contenu d'une page, en tant que chaîne de
363 caractÚres, au constructeur ``HttpResponse``::
364
365     >>> response = HttpResponse("Le texte de la page Web.")
366     >>> response = HttpResponse("Texte uniquement, s'il vous plaît.", mimetype="text/plain")
367
368 Mais si vous voulez ajouter du contenu au fil de l'eau, vous pouvez utiliser
369 ``response`` comme un objet pseudo-fichier::
370
371     >>> response = HttpResponse()
372     >>> response.write("<p>Le texte de la page Web.</p>")
373     >>> response.write("<p>Un autre paragraphe.</p>")
374
375 Vous pouvez ajouter et supprimer des entêtes en utilisant la syntaxe
376 dictionnaire::
377
378     >>> response = HttpResponse()
379     >>> response['X-DJANGO'] = "C'est le meilleur."
380     >>> del response['X-PHP']
381     >>> response['X-DJANGO']
382     "C'est le meilleur."
383
384 Notez que ``del`` ne lÚve pas de ``KeyError`` si l'entête n'existe pas.
385
386 Passage d'itérateurs
387 ~~~~~~~~~~~~~~~~~~~~
388
389 Finalement, vous pouvez passer un itérateur à ``HttpResponse`` au lieu d'une
390 chaîne de caractÚres en dur. Si vous utilisez cette technique, suivez ce schéma:
391
392     * L'itérateur doit retourner des chaînes de caractÚres.
393     * Si un ``HttpResponse`` a été initialisé avec un itérateur comme contenu,
394       vous ne pouvez pas utiliser l'instance ``HttpResponse`` comme un objet
395       pseudo-fichier. Le faire léverai une ``Exception``.
396
397 Méthodes
398 --------
399
400 ``__init__(content='', mimetype=None, status=200, content_type=DEFAULT_CONTENT_TYPE)``
401     Instancie un objet ``HttpResponse`` avec le contenu de page donné (une
402     chaîne de caractÚres) et le type MIME. Le ``DEFAULT_CONTENT_TYPE`` est
403     ``'text/html'``.
404
405     ``content`` peut être un itérateur ou une chaîne de caractÚres. S'il s'agit
406     d'un itérateur, il doit retourner des chaînes de caractÚres, et celles-ci
407     seront concaténées une à une pour former le contenu de la réponse.
408    
409     ``status`` est le `code de statut HTTP`_ de la réponse.
410
411     **(Nouveau dans la version de développement de Django)**
412     ``content_type`` est un alias de ``mimetype``. Historiquement, le paramÚtre
413     était uniquement appelé ``mimetype``, mais depuis qu'il s'agit de la valeur
414     directement utilisée pour l'entête HTTP ``Content-Type``, il peut aussi
415     inclure le jeu d'encodage des caractÚres, ce qui fait de lui plus qu'une
416     simple spécification MIME. Si ``mimetype`` est spécifié (différent de None),
417     cette valeur est utilisée. Sinon, ``content_type`` est utilisé. Si aucun
418     des deux n'est fourni, le paramÚtre ``DEFAULT_CONTENT_TYPE`` est utilisé.
419
420 ``__setitem__(header, value)``
421     Assigne le nom d'entête donné avec la valeur donnée. Les deux, ``header``
422     et ``value``, doivent être des chaînes de caractÚres.
423
424 ``__delitem__(header)``
425     Supprime l'entête correspondant au nom donné. Echoue silencieusement si
426     l'entête n'existe pas. Insensible à la casse.
427
428 ``__getitem__(header)``
429     Retourne la valeur correspondante au nom d'entête donné. Insensible à la
430     casse.
431
432 ``has_header(header)``
433     Retourne ``True`` ou ``False`` basée sur une vérification insensible à la
434     casse pour un entête correspondant au nom donné.
435
436 ``set_cookie(key, value='', max_age=None, expires=None, path='/', domain=None, secure=None)``
437     Assigne un cookie. Les paramÚtres sont les mêmes que l'objet
438     `cookie Morsel`_ de la bibliothÚque Python standard.
439
440         * ``max_age`` doit être un nombre de secondes, ou ``None`` (par défaut)
441           si le cookie ne dure que la session du navigateur client.
442         * ``expires`` doit être une chaîne de caractÚres au format
443           ``"Wdy, DD-Mon-YY HH:MM:SS GMT"``.
444         * Utilisez ``domain`` si vous voulez assigner un cookie sur plusieurs
445           domaines. Par exemple, ``domain=".lawrence.com"`` assignera un cookie
446           accessible en lecture sur les domaines www.lawrence.com,
447           blogs.lawrence.com et calendars.lawrence.com. Autrement, le cookie ne
448           sera accessible en lecture que sur son domaine de définition.
449
450     .. _`cookie Morsel`: http://www.python.org/doc/current/lib/morsel-objects.html
451
452 ``delete_cookie(key, path='/', domain=None)``
453     Supprime le cookie associé à la clé donnée. Echoue silencieusement si la clé
454     n'existe pas.
455
456     Du fait du fonctionnement des cookies, ``path`` et ``domain`` doivent
457     avoir les mêmes valeurs que celles utilisées avec ``set_cookie()``
458     -- autrement, le cookie ne sera pas détruit.
459
460 ``content``
461     Retourne le contenu en tant que chaîne de caractÚres Python, l'encodant à
462     partir d'un objet Unicode si nécessaire. Notez qu'il s'agit d'une propriété,
463     et non d'une méthode, donc utilisez ``r.content`` au lieu de ``r.content()``.
464
465 ``write(content)``, ``flush()`` et ``tell()``
466     Ces méthodes font d'une instance ``HttpResponse`` un objet pseudo-fichier.
467
468 .. _code de statut HTTP: http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html#sec10
469
470 Sous-classes d'HttpResponse
471 ---------------------------
472
473 Django vient avec un nombre de sous-classes d'``HttpResponse`` gérant plusieurs
474 types de réponses HTTP. Tout comme ``HttpResponse``, ces sous-classes résident
475 dans ``django.http``.
476
477 ``HttpResponseRedirect``
478     Le constructeur prend un unique argument -- le chemin de redirection. Ce
479     peut être une URL complÚte (e.g. ``'http://www.yahoo.com/search/'``) ou une
480     URL absolue sans domaine (e.g. ``'/search/'``). Notez que cela retournera
481     un code de statut HTTP 302.
482
483 ``HttpResponsePermanentRedirect``
484     Identique à ``HttpResponseRedirect``, mais retourne une redirection
485     permanente (code de statut HTTP 301) au lieu d'une redirection simple (code
486     de statut 302).
487
488 ``HttpResponseNotModified``
489     Le constructeur ne prend pas d'arguments. Utilisez celle-ci pour notifier
490     qu'une page n'a pas été modifiée depuis la derniÚre requête de l'utilisateur.
491
492 ``HttpResponseBadRequest``
493     **Nouveau dans la version de développement de Django.**
494     Agit exactement comme un ``HttpResponse`` mais avec un code de statut 400.
495
496 ``HttpResponseNotFound``
497     Agit exactement comme un ``HttpResponse`` mais avec un code de statut 404.
498
499 ``HttpResponseForbidden``
500     Agit exactement comme un ``HttpResponse`` mais avec un code de statut 403.
501
502 ``HttpResponseNotAllowed``
503     Identique à ``HttpResponse``, mais avec un code de statut 405. Prends un
504     unique argument obligatoire: une liste de méthodes permises (e.g. ``['GET',
505     'POST']``).
506
507 ``HttpResponseGone``
508     Agit exactement comme un ``HttpResponse`` mais avec un code de statut 410.
509
510 ``HttpResponseServerError``
511     Agit exactement comme un ``HttpResponse`` mais avec un code de statut 500.
512
513 Retourner des erreurs
514 =====================
515
516 Retourner des erreurs en Django est aisé. Nous avons déjà mentionné les
517 sous-classes ``HttpResponseNotFound``, ``HttpResponseForbidden``,
518 ``HttpResponseServerError``, etc.; retournez simplement une instance de l'une
519 de ces sous-classes au lieu d'un ``HttpResponse`` normal dans le but de
520 signifier une erreur. Par exemple::
521
522     def ma_vue(request):
523         # ...
524         if foo:
525             return HttpResponseNotFound('<h1>Page non trouvée</h1>')
526         else:
527             return HttpResponse('<h1>Page trouvée</h1>')
528
529 Les erreurs 404 étant les erreurs HTTP les plus courante, il y a une maniÚre
530 plus simple de gérer ce genre d'erreurs.
531
532 L'exception Http404
533 -------------------
534
535 Lorsque vous retournez une erreur telle que ``HttpResponseNotFound``, vous êtes
536 responsable de la définition du code HTML résultant pour la page d'erreur::
537
538     return HttpResponseNotFound('<h1>Page non trouvée</h1>')
539
540 Par commodité, et parce que c'est une bonne idée de disposer d'une page d'erreur
541 404 consistente pour votre site, Django fourni une exception ``Http404``. Si
542 vous levez un ``Http404`` n'importe où dans votre fonction de vue, Django
543 l'attrapera et retournera une page d'erreur standard pour votre application,
544 contenant un code d'erreur HTTP 404.
545
546 Exemple d'utilisation::
547
548     from django.http import Http404
549
550     def detail(request, vote_id):
551         try:
552             p = Vote.objects.get(pk=vote_id)
553         except Vote.DoesNotExist:
554             raise Http404
555         return render_to_response('votes/detail.html', {'vote': p})
556
557 Pour complÚtement utiliser une exception ``Http404``, vous devez créer un
558 gabarit qui sera affiché lorsqu'une erreur 404 sera levée. Ce gabarit doit être
559 appelé ``404.html`` et doit résider au premier niveau de votre arborescence de
560 gabarits.
561
562 Personnaliser les erreurs de vues
563 ---------------------------------
564
565 La vue 404 (page non trouvée)
566 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
567
568 Lorsque que vous levez une exception ``Http404``, Django charge une vue spéciale
569 dévolue à la gestion des erreurs 404. Par défaut, il s'agit de la vue
570 ``django.views.defaults.page_not_found``, qui charge et rend le gabarit
571 ``404.html``.
572
573 Ceci implique que vous définissiez un gabarit ``404.html`` à la racine de votre
574 répertoire de gabarits. Ce gabarit sera utilisé pour toutes les erreurs 404.
575
576 Cette vue ``page_not_found`` devrait suffire à 99% des applications Web, mais si
577 vous désirez surcharger la vue 404, vous pouvez spécifier un ``handler404`` dans
578 votre URLconf, tel que::
579
580     handler404 = 'monsite.views.ma_vue_404'
581
582 En coulisse, Django identifie la vue 404 en regardant du cÎté du ``handler404``.
583 Par défaut, les URLconfs contiennent la ligne suivante::
584
585     from django.conf.urls.defaults import *
586
587 Ceci se charge de définir le ``handler404`` du module courant. Comme vous pouvez
588 le voir dans ``django/conf/urls/defaults.py``, le ``handler404`` est défini à
589 ``'django.views.defaults.page_not_found'`` par défaut.
590
591 Trois choses à noter à propos des vues 404:
592
593     * La vue 404 est aussi appelée si Django ne trouve aucun résultat aprÚs
594       avoir passé en revue chaque expression réguliÚre de l'URLconf.
595
596     * Si vous ne définissez pas votre propre vue 404 -- utilisant simplement
597       celle par défaut, ce qui est recommandé -- vous avez quand même une
598       obligation: Créer un gabarit ``404.html`` à la racine de votre répertoire
599       de gabarits. La vue 404 par défaut utilisera ce gabarit pour toutes les
600       erreurs 404. La vue 404 par défaut passera une variable au gabarit :
601       ``request_path``, qui est l'URL résultante du 404.
602
603     * Il est passé un ``RequestContext`` à la vue 404, ce qui lui donnera accÚs
604       aux variables fournies par votre propriété
605       ``TEMPLATE_CONTEXT_PROCESSORS`` (e.g., ``MEDIA_URL``).
606
607     * Si ``DEBUG`` contient la valeur ``True`` (dans vos paramÚtres de
608       configuration de module) alors votre vue ne sera jamais utilisée, et le
609       contexte de débogage sera affiché par défaut.
610
611 La vue 500 (erreur serveur)
612 ~~~~~~~~~~~~~~~~~~~~~~~~~~~
613
614 De maniÚre similaire, Django exécute un comportement spécial dans le cas
615 d'une erreur à l'exécution au niveau de votre vue. Si la vue s'achÚve par une
616 exception, Django appellera, par défaut, la vue
617 ``django.views.defaults.server_error``, qui charge et rend le gabarit
618 ``500.html``.
619
620 Ceci implique que vous définissiez un gabarit ``500.html`` à la racine de votre
621 répertoire de gabarits. Ce gabarit sera utilisé pour toutes les erreurs internes
622 au serveur. La vue 500 par défaut ne passe aucune variable à ce gabarit et est
623 rendue avec un ``Context`` vide pour minimiser le risque d'erreurs
624 additionnelles.
625
626 Cette vue ``server_error`` devrait suffire à 99% des applications Web, mais si
627 vous voulez surcharger cette vue, vous pouvez spécifier un ``handler500`` dans
628 votre URLconf, tel que::
629
630     handler500 = 'monsite.views.ma_vue_d_erreur'
631
632 En coulisse, Django identifie la vue d'erreur en recherchant le ``handler500``.
633 Par défaut, les URLconfs contiennent la ligne suivante::
634
635     from django.conf.urls.defaults import *
636
637 Ceci ce charge de configurer le ``handler500`` pour le module courant. Comme
638 vous pouvez le voir dans ``django/conf/urls/defaults.py``, ``handler500`` est
639 assigné à ``'django.views.defaults.server_error'`` par défaut.
Note: See TracBrowser for help on using the browser.