| 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. |
|---|