TemplateResponse
och SimpleTemplateResponse
¶
Standard HttpResponse
-objekt är statiska strukturer. De förses med ett block av förrenderat innehåll vid konstruktionstillfället, och även om detta innehåll kan ändras är det inte i en form som gör det enkelt att utföra ändringar.
Ibland kan det dock vara fördelaktigt att låta dekoratorer eller mellanprogram modifiera ett svar efter att det har konstruerats av vyn. Du kanske t.ex. vill ändra den mall som används eller lägga in ytterligare data i kontexten.
TemplateResponse tillhandahåller ett sätt att göra just det. Till skillnad från grundläggande HttpResponse
-objekt behåller TemplateResponse-objekt detaljerna i mallen och sammanhanget som tillhandahölls av vyn för att beräkna svaret. Den slutliga utgången av svaret beräknas inte förrän den behövs, senare i svarsprocessen.
objekt av typen ``SimpleTemplateResponse¶
Attribut¶
- SimpleTemplateResponse.template_name¶
Namnet på den mall som ska återges. Accepterar ett backend-beroende mallobjekt (t.ex. de som returneras av
get_template()
), namnet på en mall eller en lista med mallnamn.Exempel:
['foo.html', 'path/to/bar.html']
- SimpleTemplateResponse.context_data¶
De kontextdata som ska användas när mallen renderas. Det måste vara en
dict
.Exempel:
{'foo': 123}`
Metoder¶
- SimpleTemplateResponse.__init__(template, context=None, content_type=None, status=None, charset=None, using=None, headers=None)[source]¶
Instansierar ett
SimpleTemplateResponse
-objekt med den angivna mallen, kontexten, innehållstypen, HTTP-statusen och teckenuppsättningen.mall
Ett backendberoende mallobjekt (t.ex. de som returneras av
get_template()
), namnet på en mall eller en lista med mallnamn.kontext
En
dict
med värden som ska läggas till i mallkontexten. Som standard är detta en tom ordbok.innehållstyp
Det värde som ingår i HTTP-rubriken
Content-Type
, inklusive specifikationen för MIME-typen och teckenkodningen. Omcontent_type
anges, används dess värde. I annat fall används'text/html
.status
HTTP-statuskoden för svaret.
teckensnittsuppsättning
Den teckenuppsättning som svaret kommer att kodas med. Om det inte anges kommer det att extraheras från
content_type
, och om det inte lyckas kommer inställningenDEFAULT_CHARSET`
att användas.använder
:Inställning:`NAME <TEMPLATES-NAME>` för en mallmotor som ska användas för att ladda mallen.
headers
En
dict
av HTTP-rubriker som ska läggas till i svaret.
- SimpleTemplateResponse.resolve_context(context)[source]¶
Förbehandlar kontextdata som kommer att användas för att rendera en mall. Accepterar en
dict
av kontextdata. Returnerar som standard sammadict
.Åsidosätt denna metod för att anpassa sammanhanget.
- SimpleTemplateResponse.resolve_template(template)[source]¶
Bestämmer vilken mallinstans som ska användas för rendering. Accepterar ett backend-beroende mallobjekt (t.ex. de som returneras av
get_template()
), namnet på en mall eller en lista med mallnamn.Returnerar den backend-beroende mallobjektinstansen som ska renderas.
Åsidosätt denna metod för att anpassa laddning av mallar.
- SimpleTemplateResponse.add_post_render_callback()[source]¶
Lägg till en callback som kommer att anropas efter att rendering har ägt rum. Den här kroken kan användas för att skjuta upp vissa bearbetningsoperationer (t.ex. cachelagring) till efter att renderingen har ägt rum.
Om
SimpleTemplateResponse
redan har renderats, kommer återuppringningen att anropas omedelbart.När callbacks anropas kommer de att få ett enda argument - den renderade
SimpleTemplateResponse
-instansen.Om återuppringningen returnerar ett värde som inte är
None
, kommer detta att användas som svar i stället för det ursprungliga svarsobjektet (och kommer att skickas till nästa återuppringning av postrendering etc.)
- SimpleTemplateResponse.render()[source]¶
Sätter
response.content
till det resultat som erhålls genomSimpleTemplateResponse.rendered_content
, kör alla callbacks efter rendering och returnerar det resulterande svarsobjektet.render()
kommer bara att ha effekt första gången den anropas. Vid efterföljande anrop returneras det resultat som erhölls vid det första anropet.
objekt av typen ``TemplateResponse¶
- class TemplateResponse[source]¶
TemplateResponse
är en underklass tillSimpleTemplateResponse`
som känner till den aktuellaHttpRequest`
.
Metoder¶
- TemplateResponse.__init__(request, template, context=None, content_type=None, status=None, charset=None, using=None, headers=None)[source]¶
Instansierar ett
TemplateResponse
-objekt med den angivna begäran, mallen, kontexten, innehållstypen, HTTP-statusen och teckenuppsättningen.begäran
En
HttpRequest
-instans.mall
Ett backendberoende mallobjekt (t.ex. de som returneras av
get_template()
), namnet på en mall eller en lista med mallnamn.kontext
En
dict
med värden som ska läggas till i mallkontexten. Som standard är detta en tom ordbok.innehållstyp
Det värde som ingår i HTTP-rubriken
Content-Type
, inklusive specifikationen för MIME-typen och teckenkodningen. Omcontent_type
anges, används dess värde. I annat fall används'text/html
.status
HTTP-statuskoden för svaret.
teckensnittsuppsättning
Den teckenuppsättning som svaret kommer att kodas med. Om det inte anges kommer det att extraheras från
content_type
, och om det inte lyckas kommer inställningenDEFAULT_CHARSET`
att användas.använder
:Inställning:`NAME <TEMPLATES-NAME>` för en mallmotor som ska användas för att ladda mallen.
headers
En
dict
av HTTP-rubriker som ska läggas till i svaret.
Renderingsprocessen¶
Innan en instans av TemplateResponse
kan returneras till klienten måste den renderas. Renderingsprocessen tar den mellanliggande representationen av mall och kontext och förvandlar den till den slutliga byte-strömmen som kan serveras till klienten.
Det finns tre omständigheter under vilka ett TemplateResponse
kommer att återges:
När
TemplateResponse
-instansen uttryckligen renderas med hjälp av metodenSimpleTemplateResponse.render()
.När innehållet i svaret uttryckligen anges genom att tilldela
response.content
.Efter att ha passerat genom middleware för mallsvar, men innan den passerar genom middleware för svar.
En TemplateResponse
kan bara renderas en gång. Det första anropet till SimpleTemplateResponse.render()
anger svarets innehåll; efterföljande renderingsanrop ändrar inte svarets innehåll.
Men när response.content
uttryckligen tilldelas tillämpas ändringen alltid. Om du vill tvinga innehållet att återskapas kan du omvärdera det återskapade innehållet och tilldela innehållet i svaret manuellt:
# 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
Återkallelser efter rendering¶
Vissa åtgärder - t.ex. cachelagring - kan inte utföras på en mall som inte är renderad. De måste utföras på ett helt komplett och renderat svar.
Om du använder middleware kan du göra det. Middleware ger flera möjligheter att bearbeta ett svar vid avslut från en vy. Om du lägger in ett beteende i svarsmellanvaran är det garanterat att det körs efter att mallrenderingen har ägt rum.
Men om du använder en dekorator finns inte samma möjligheter. Alla beteenden som definieras i en dekorator hanteras omedelbart.
För att kompensera för detta (och andra liknande användningsfall) kan du i TemplateResponse
registrera callbacks som anropas när renderingen har slutförts. Med hjälp av denna callback kan du skjuta upp kritisk bearbetning till en punkt där du kan garantera att renderat innehåll kommer att vara tillgängligt.
För att definiera en återuppringning efter rendering definierar du en funktion som tar ett enda argument – response – och registrerar funktionen med mallen response:
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()
kommer att anropas efter att mytemplate.html
har renderats, och kommer att få den fullständigt renderade TemplateResponse
-instansen som argument.
Om mallen redan har renderats kommer återuppringningen att anropas omedelbart.
Använda TemplateResponse
och SimpleTemplateResponse
¶
Ett TemplateResponse
-objekt kan användas var som helst där ett vanligt django.http.HttpResponse
kan användas. Det kan också användas som ett alternativ till att anropa render()
.
Följande vy returnerar till exempel en TemplateResponse
med en mall och en kontext som innehåller en frågeuppsättning:
from django.template.response import TemplateResponse
def blog_index(request):
return TemplateResponse(
request, "entry_list.html", {"entries": Entry.objects.all()}
)