TemplateResponse
和 SimpleTemplateResponse
¶
標準的 HttpResponse
物件是靜態結構。它們在建構時會被提供一個預先渲染的內容區塊,雖然該內容可以被修改,但其形式並不容易進行修改。
然而,有時允許裝飾器或中介軟體在視圖建構回應後修改回應可能是有益的。例如,您可能想要變更所使用的範本,或將額外的資料放入內容中。
TemplateResponse 提供了一種方法來做到這一點。與基本的 HttpResponse
物件不同,TemplateResponse 物件保留了視圖提供的範本和內容的詳細資訊,以計算回應。回應的最終輸出要到回應流程的稍後階段才需要計算。
SimpleTemplateResponse
物件¶
屬性¶
- SimpleTemplateResponse.template_name¶
要渲染的範本名稱。接受後端相依的範本物件(例如由
get_template()
返回的物件)、範本名稱或範本名稱列表。範例:
['foo.html', 'path/to/bar.html']
方法¶
- SimpleTemplateResponse.__init__(template, context=None, content_type=None, status=None, charset=None, using=None, headers=None)[原始碼]¶
使用給定的範本、內容、內容類型、HTTP 狀態和字元集,實例化一個
SimpleTemplateResponse
物件。template
後端相依的範本物件(例如由
get_template()
返回的物件)、範本名稱或範本名稱列表。context
要新增到範本內容的
dict
值。預設情況下,這是一個空字典。content_type
HTTP
Content-Type
標頭中包含的值,包括 MIME 類型規格和字元集編碼。如果指定了content_type
,則使用其值。否則,使用'text/html'
。status
回應的 HTTP 狀態碼。
charset
回應將使用的字元集。如果未給定,則會從
content_type
中提取,如果提取失敗,則會使用DEFAULT_CHARSET
設定。using
要用於載入範本的範本引擎的
NAME
。headers
要新增到回應的 HTTP 標頭
dict
。
- SimpleTemplateResponse.resolve_context(context)[原始碼]¶
預先處理將用於渲染範本的內容資料。接受內容資料的
dict
。預設情況下,返回相同的dict
。覆寫此方法以自訂內容。
- SimpleTemplateResponse.resolve_template(template)[原始碼]¶
解析要用於渲染的範本實例。接受後端相依的範本物件(例如由
get_template()
返回的物件)、範本名稱或範本名稱列表。返回要渲染的後端相依的範本物件實例。
覆寫此方法以自訂範本載入。
- SimpleTemplateResponse.add_post_render_callback()[原始碼]¶
新增一個在渲染發生後將被呼叫的回呼。此掛鉤可用於延遲某些處理操作(例如快取)直到渲染發生後。
如果
SimpleTemplateResponse
已渲染,則會立即呼叫回呼。當呼叫時,回呼將被傳遞一個參數 - 渲染的
SimpleTemplateResponse
實例。如果回呼返回一個非
None
的值,則此值將被用作回應,而不是原始回應物件(並將傳遞給下一個後渲染回呼等)。
- SimpleTemplateResponse.render()[原始碼]¶
將
response.content
設定為透過SimpleTemplateResponse.rendered_content
獲得的結果,執行所有後渲染回呼,並返回結果回應物件。render()
只有在第一次呼叫時才會生效。在後續呼叫中,它將返回從第一次呼叫獲得的結果。
TemplateResponse
物件¶
- class TemplateResponse[原始碼]¶
TemplateResponse
是SimpleTemplateResponse
的子類別,它了解目前的HttpRequest
。
方法¶
- TemplateResponse.__init__(request, template, context=None, content_type=None, status=None, charset=None, using=None, headers=None)[原始碼]¶
使用給定的請求、樣板、內容、內容類型、HTTP 狀態和字元集,實例化一個
TemplateResponse
物件。request
一個
HttpRequest
實例。template
後端相依的範本物件(例如由
get_template()
返回的物件)、範本名稱或範本名稱列表。context
要新增到範本內容的
dict
值。預設情況下,這是一個空字典。content_type
HTTP
Content-Type
標頭中包含的值,包括 MIME 類型規格和字元集編碼。如果指定了content_type
,則使用其值。否則,使用'text/html'
。status
回應的 HTTP 狀態碼。
charset
回應將使用的字元集。如果未給定,則會從
content_type
中提取,如果提取失敗,則會使用DEFAULT_CHARSET
設定。using
要用於載入範本的範本引擎的
NAME
。headers
要新增到回應的 HTTP 標頭
dict
。
渲染過程¶
在 TemplateResponse
實例可以返回給客戶端之前,它必須被渲染。渲染過程會取得樣板和內容的中間表示,並將其轉換為可以服務於客戶端的最終位元流。
有三種情況會渲染 TemplateResponse
當使用
SimpleTemplateResponse.render()
方法顯式渲染TemplateResponse
實例時。當透過指定
response.content
顯式設定回應的內容時。在通過樣板回應中介軟體之後,但在通過回應中介軟體之前。
TemplateResponse
只能被渲染一次。第一次調用 SimpleTemplateResponse.render()
會設定回應的內容;後續的渲染呼叫不會改變回應內容。
但是,當顯式指定 response.content
時,變更會始終被套用。如果您想要強制重新渲染內容,您可以重新評估渲染後的內容,並手動指定回應的內容
# 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
渲染後回呼¶
某些操作(例如快取)無法在未渲染的樣板上執行。它們必須在完全完成和渲染的回應上執行。
如果您正在使用中介軟體,您可以做到這一點。中介軟體提供了多個機會來處理從視圖中退出的回應。如果您將行為放在回應中介軟體中,則保證它會在樣板渲染發生後執行。
但是,如果您正在使用裝飾器,則不存在相同的機會。在裝飾器中定義的任何行為都會立即處理。
為了彌補這一點(以及任何其他類似的用例),TemplateResponse
允許您註冊在渲染完成時會調用的回呼。使用此回呼,您可以延遲關鍵處理,直到可以保證渲染內容可用的時間點。
若要定義渲染後回呼,請定義一個採用單一引數(回應)的函式,並使用樣板回應註冊該函式
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
在 mytemplate.html
渲染後會調用 my_render_callback()
,並會將完全渲染的 TemplateResponse
實例作為引數提供。
如果樣板已經渲染,則會立即調用回呼。
使用 TemplateResponse
和 SimpleTemplateResponse
¶
TemplateResponse
物件可用於任何可以使用一般 django.http.HttpResponse
的地方。它也可以用來替代呼叫 render()
。
例如,以下視圖會傳回 TemplateResponse
,其中包含樣板和包含查詢集的內容
from django.template.response import TemplateResponse
def blog_index(request):
return TemplateResponse(
request, "entry_list.html", {"entries": Entry.objects.all()}
)