TemplateResponse och SimpleTemplateResponseLink to this heading
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 ``SimpleTemplateResponseLink to this heading
- class SimpleTemplateResponseLink to this definition
AttributLink to this heading
- SimpleTemplateResponse.template_nameLink to this definition
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_dataLink to this definition
De kontextdata som ska användas när mallen renderas. Det måste vara en
dict.Exempel:
{'foo': 123}
- SimpleTemplateResponse.rendered_contentLink to this definition
Det aktuella renderade värdet av svarsinnehållet, med hjälp av den aktuella mallen och kontextdata.
- SimpleTemplateResponse.is_renderedLink to this definition
Ett boolean som anger om svarsinnehållet har återgivits.
MetoderLink to this heading
- SimpleTemplateResponse.__init__(template, context=None, content_type=None, status=None, charset=None, using=None, headers=None)Link to this definition
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)Link to this definition
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)Link to this definition
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()Link to this definition
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()Link to this definition
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 ``TemplateResponseLink to this heading
- class TemplateResponseLink to this definition
TemplateResponseär en underklass tillSimpleTemplateResponse`som känner till den aktuellaHttpRequest`.
MetoderLink to this heading
- TemplateResponse.__init__(request, template, context=None, content_type=None, status=None, charset=None, using=None, headers=None)Link to this definition
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.
RenderingsprocessenLink to this heading
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 renderingLink to this heading
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 SimpleTemplateResponseLink to this heading
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()}
)