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.mallEtt backendberoende mallobjekt (t.ex. de som returneras av
get_template()), namnet på en mall eller en lista med mallnamn.kontextEn
dictmed värden som ska läggas till i mallkontexten. Som standard är detta en tom ordbok.innehållstypDet värde som ingår i HTTP-rubriken
Content-Type, inklusive specifikationen för MIME-typen och teckenkodningen. Omcontent_typeanges, används dess värde. I annat fall används'text/html.statusHTTP-statuskoden för svaret.
teckensnittsuppsättningDen 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änderNAMEför en mallmotor som ska användas för att ladda mallen.headersEn
dictav 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
dictav 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 hook kan användas för att skjuta upp vissa bearbetningsoperationer (t.ex. cachelagring) till efter att renderingen har ägt rum.
Om
SimpleTemplateResponseredan 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.contenttill 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äranEn
HttpRequest-instans.mallEtt backendberoende mallobjekt (t.ex. de som returneras av
get_template()), namnet på en mall eller en lista med mallnamn.kontextEn
dictmed värden som ska läggas till i mallkontexten. Som standard är detta en tom ordbok.innehållstypDet värde som ingår i HTTP-rubriken
Content-Type, inklusive specifikationen för MIME-typen och teckenkodningen. Omcontent_typeanges, används dess värde. I annat fall används'text/html.statusHTTP-statuskoden för svaret.
teckensnittsuppsättningDen 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änderNAMEför en mallmotor som ska användas för att ladda mallen.headersEn
dictav 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()}
)