Les objets HttpResponse standards sont des structures statiques. Ils disposent d’un bloc de contenu pré-rendu au moment de la construction de l’objet, et même si ce contenu peut être modifié, il ne l’est pas dans une forme permettant d’effectuer aisément des modifications.
Cependant, il peut parfois être avantageux de permettre à des décorateurs ou des intergiciels de modifier une réponse après sa construction par la vue. Par exemple, on peut vouloir modifier le gabarit utilisé ou ajouter des données supplémentaires dans le contexte.
Les objets TemplateResponse permettent justement de faire cela. Au contraire des objets HttpResponse basiques, les objets TemplateResponse conservent les informations de gabarit et de contexte fournis par la vue pour produire la réponse. Le résultat final de la réponse n’est produit qu’au dernier moment, plus tard dans le processus de réponse.
Le nom du gabarit servant à l’affichage. Accepte un objet Template, un chemin vers un gabarit ou une liste de chemin de gabarits.
Exemple : ['foo.html', 'chemin/vers/bar.html']
Les données de contexte à utiliser lors de la production du gabarit. Cela peut être un dictionnaire ou un objet de contexte.
Exemple : {'foo': 123}
Crée une instance d’objet SimpleTemplateResponse avec le gabarit, le contexte, le type de contenu et le statut HTTP indiqués.
Le nom complet d’un gabarit ou une liste de noms de gabarits. Des instances de Template peuvent également être utilisées.
Un dictionnaire de valeurs à ajouter au contexte du gabarit. Par défaut, ce dictionnaire est vide. Les objets Context sont également acceptés comme valeurs de context.
Le code de statut HTTP de la réponse.
content_type
Changed in Django 1.5:Historiquement, ce paramètre s’appelait mimetype (aujourd’hui obsolète), mais comme il s’agit en fait de la valeur incluse dans l’en-tête HTTP Content-Type, il peut également contenir le codage du jeu de caractères, ce qui en fait plus qu’une simple spécification de type MIME. Si mimetype est renseigné (autre que None), c’est cette valeur qui est utilisée. Sinon, c’est content_type qui est utilisé. Si aucun n’est fourni, c’est DEFAULT_CONTENT_TYPE qui est alors utilisé.
Convertit les données de contexte en une instance de contexte pouvant être utilisée pour le rendu d’un gabarit. Accepte un dictionnaire de données de contexte ou un objet de contexte. Renvoie une instance Context contenant les données fournies.
Surchargez cette méthode afin de personnaliser l’instanciation du contexte.
Résoud l’instance de gabarit à utiliser pour le rendu. Accepte un chemin de gabarit à utiliser ou un liste de chemins de gabarits. Il est aussi possible de fournir des instances de Template. Renvoie l’instance Template à produire.
Surchargez cette méthode afin de personnaliser la production du gabarit.
Ajoute une fonction de rappel qui sera appelée après la fin du rendu. Ce point d’entrée peut être utilisé pour reporter certaines opérations de traitement (comme le cache) à la fin de l’étape de rendu.
Si l’objet SimpleTemplateResponse a déjà été rendu, la fonction de rappel est immédiatement appelée.
Lorsqu’elles sont appelées, les fonctions de rappel reçoivent un seul paramètre, l’instance SimpleTemplateResponse rendue.
Si la fonction de rappel renvoie une valeur autre que None, cette valeur est utilisée comme réponse en lieu et place de l’objet réponse original (et sera transmise à la fonction de rappel « post-rendu » suivante, etc.).
Définit response.content au résultat obtenu par SimpleTemplateResponse.rendered_content, exécute toutes les fonctions de rappel « post-rendu » et renvoie l’objet réponse résultant.
render() n’a d’effet que lors de son premier appel. Pour les appels suivants, elle renvoie le résultat obtenu lors du premier appel.
TemplateResponse est une sous-classe de SimpleTemplateResponse qui utilise un contexte RequestContext au lieu de Context.
Crée une instance d’objet TemplateResponse avec le gabarit, le contexte, le type MIME et le statut HTTP indiqués.
Une instance HttpRequest.
Le nom complet d’un gabarit ou une liste de noms de gabarits. Des instances de Template peuvent également être utilisées.
Un dictionnaire de valeurs à ajouter au contexte du gabarit. Par défaut, ce dictionnaire est vide. Les objets Context sont également acceptés comme valeurs de context. Si vous transmettez une instance ou une sous-classe de Context, cet objet sera utilisé au lieu de créer un nouvel objet RequestContext.
Le code de statut HTTP de la réponse.
content_type
Changed in Django 1.5.Historiquement, ce paramètre s’appelait mimetype (aujourd’hui obsolète), mais comme il s’agit en fait de la valeur incluse dans l’en-tête HTTP Content-Type, il peut également contenir le codage du jeu de caractères, ce qui en fait plus qu’une simple spécification de type MIME. Si mimetype est renseigné (autre que None), c’est cette valeur qui est utilisée. Sinon, c’est content_type qui est utilisé. Si aucun n’est fourni, c’est DEFAULT_CONTENT_TYPE qui est alors utilisé.
Une indication de l’application contenant la vue actuelle. Consultez la stratégie de résolution des URL en espaces de noms pour plus d’informations.
Avant qu’une instance TemplateResponse puisse être renvoyée au client, elle doit être rendue. Le processus de rendu se saisit de la représentation intermédiaire du gabarit et du contexte, et s’en sert pour produire le flux binaire final qui sera envoyé au client.
Trois circonstances provoquent le rendu d’un objet TemplateResponse:
Lorsqu’une instance TemplateResponse est explicitement rendue par le moyen de la méthode SimpleTemplateResponse.render().
Lorsque le contenu de la réponse est défini explicitement en attribuant une valeur à response.content.
Après avoir traversé l’intergiciel de réponse de gabarit, mais avant de passer par l’intergiciel de réponse.
Un objet TemplateResponse peut être rendu une seule fois. Le premier appel à SimpleTemplateResponse.render() définit le contenu de la réponse ; les appels de rendu suivants ne modifient pas le contenu de la réponse.
Cependant, lorsque response.content reçoit explicitement une valeur, la modification est toujours appliquée. Si vous souhaitez forcer le contenu à être rendu à nouveau, vous pouvez ré-évaluer le contenu à produire et attribuer manuellement ce contenu à la réponse :
# Set up a rendered TemplateResponse
>>> from django.template.response import TemplateResponse
>>> t = TemplateResponse(request, 'original.html', {})
>>> t.render()
>>> print(t.content)
Original content
# Re-rendering doesn't change content
>>> t.template_name = 'new.html'
>>> t.render()
>>> print(t.content)
Original content
# Assigning content does change, no render() call required
>>> t.content = t.rendered_content
>>> print(t.content)
New content
Certaines opérations (comme la mise en cache) ne peuvent pas opérer sur un gabarit non rendu. Elles doivent agir sur une réponse dont le rendu est complet et terminé.
Si vous utilisez un intergiciel, la solution est simple. Les intergiciels offrent de multiples possibilités de traiter une réponse à la sortie d’une vue. Si vous placez une certaine logique dans l’intergiciel de réponse, elle s’exécutera à coup sûr après la phase de rendu du gabarit.
Cependant, si vous utilisez un décorateur, une telle possibilité n’existe pas. Toute logique placée dans un décorateur est traitée immédiatement.
Pour compenser cela (et d’autres cas d’utilisation similaires), TemplateResponse vous permet d’inscrire des fonctions de rappel qui seront invoquées après la fin du rendu. En utilisant ces fonctions de rappel, vous pouvez reporter un traitement critique à un stade où vous êtes certain que le contenu rendu sera disponible.
Pour définir une fonction de rappel « post-rendu », il suffit de définir une fonction acceptant un seul paramètre (response) et d’inscrire cette fonction auprès de la réponse de gabarit :
from django.template.response import TemplateResponse
def my_render_callback(response):
# Do content-sensitive processing
do_post_processing()
def my_view(request):
# Create a response
response = TemplateResponse(request, 'mytemplate.html', {})
# Register the callback
response.add_post_render_callback(my_render_callback)
# Return the response
return response
my_render_callback() sera invoquée après que mytemplate.html aura été rendu et recevra en paramètre l’instance TemplateResponse dont le rendu sera terminé.
Si le gabarit a déjà été rendu, la fonction de rappel est immédiatement appelée.
Un objet TemplateResponse peut être utilisé partout où un objet HttpResponse normal peut être utilisé. Il peut également être utilisé comme alternative à un appel à render_to_response().
Par exemple, la vue simple suivante renvoie un objet TemplateResponse() avec un gabarit simple et un contexte contenant un jeu de requête :
from django.template.response import TemplateResponse
def blog_index(request):
return TemplateResponse(request, 'entry_list.html', {'entries': Entry.objects.all()})
Jan 13, 2016