標(biāo)準(zhǔn)的HttpResponse
對(duì)象是靜態(tài)的結(jié)構(gòu)。在構(gòu)造的時(shí)候提供給它們一個(gè)渲染之前的內(nèi)容,但是當(dāng)內(nèi)容改變時(shí)它們卻不能很容易地完成相應(yīng)的改變。
然而,有時(shí)候允許裝飾器或者中間件在響應(yīng)被構(gòu)造之后修改它是很有用的。例如,你可能想改變使用的模板,或者添加額外的數(shù)據(jù)到上下文中。
TemplateResponse
提供了實(shí)現(xiàn)這一點(diǎn)的方法。與基本的HttpResponse 對(duì)象不同,TemplateResponse
對(duì)象會(huì)記住視圖提供的模板和上下文的詳細(xì)信息來(lái)計(jì)算響應(yīng)。響應(yīng)的最終結(jié)果在后來(lái)的響應(yīng)處理過(guò)程中直到需要時(shí)才計(jì)算。
class SimpleTemplateResponse[source]
SimpleTemplateResponse.template_name
渲染的模板的名稱(chēng)。接收一個(gè)與后端有關(guān)的模板對(duì)象(例如get_template()
返回的對(duì)象)、模板的名稱(chēng)或者一個(gè)模板名稱(chēng)列表。
例如:['foo.html', 'path/to/bar.html']
Deprecated since version 1.8:
template_name 以前只接受一個(gè) Template。
SimpleTemplateResponse.context_data
渲染模板時(shí)用到的上下文數(shù)據(jù)。它必須是一個(gè)dict
。
例如:{'foo': 123}
Deprecated since version 1.8:
context_data 以前只接受一個(gè) Context。
SimpleTemplateResponse.rendered_content[source]
使用當(dāng)前的模板和上下文數(shù)據(jù)渲染出來(lái)的響應(yīng)內(nèi)容。
SimpleTemplateResponse.is_rendered[source]
一個(gè)布爾值,表示響應(yīng)內(nèi)容是否已經(jīng)渲染。
SimpleTemplateResponse.__init__(template, context=None, content_type=None, status=None, charset=None, using=None)[source]
使用給定的模板、上下文、Content-Type、HTTP 狀態(tài)和字符集初始化一個(gè)SimpleTemplateResponse
對(duì)象。
template
一個(gè)與后端有關(guān)的模板對(duì)象(例如get_template()
返回的對(duì)象)、模板的名稱(chēng)或者一個(gè)模板名稱(chēng)列表。
Deprecated since version 1.8:
template 以前只接受一個(gè)Template。
context
一個(gè)dict
,包含要添加到模板上下文中的值。它默認(rèn)是一個(gè)空的字典。
Deprecated since version 1.8:
context 以前只接受一個(gè)Context。
content_type
HTTP Content-Type
頭部包含的值,包含MIME 類(lèi)型和字符集的編碼。 如果指定content_type
,則使用它的值。 否則,使用DEFAULT_CONTENT_TYPE
。
status
響應(yīng)的HTTP 狀態(tài)碼。
charset
響應(yīng)編碼使用的字符集。 如果沒(méi)有給出則從content_type
中提取,如果提取不成功則使用 DEFAULT_CHARSET
設(shè)置。
using
加載模板使用的模板引擎的名稱(chēng)。
Changed in Django 1.8:
添加charset 和using 參數(shù)。
SimpleTemplateResponse.resolve_context(context)[source]
預(yù)處理即將用于渲染模板的上下文數(shù)據(jù)。接受包含上下文數(shù)據(jù)的一個(gè)dict
。默認(rèn)返回同一個(gè)dict
。
若要自定義上下文,請(qǐng)覆蓋這個(gè)方法。
Changed in Django 1.8:
resolve_context 返回一個(gè)dict。它以前返回一個(gè)Context。
Deprecated since version 1.8:
resolve_context 不再接受Context。
SimpleTemplateResponse.resolve_template(template)[source]
解析渲染用到的模板實(shí)例。接收一個(gè)與后端有關(guān)的模板對(duì)象(例如get_template()
返回的對(duì)象)、模板的名稱(chēng)或者一個(gè)模板名稱(chēng)列表。
返回將被渲染的模板對(duì)象。
若要自定義模板的加載,請(qǐng)覆蓋這個(gè)方法。
Changed in Django 1.8:
resolve_template 返回一個(gè)與后端有關(guān)的模板對(duì)象。它以前返回一個(gè)Template。
Deprecated since version 1.8:
resolve_template 不再接受一個(gè) Template。
SimpleTemplateResponse.add_post_render_callback()[source]
添加一個(gè)渲染之后調(diào)用的回調(diào)函數(shù)。這個(gè)鉤子可以用來(lái)延遲某些特定的處理操作(例如緩存)到渲染之后。
如果SimpleTemplateResponse
已經(jīng)渲染,那么回調(diào)函數(shù)將立即執(zhí)行。
調(diào)用的時(shí)只傳遞給回調(diào)函數(shù)一個(gè)參數(shù) —— 渲染后的 SimpleTemplateResponse
實(shí)例。
如果回調(diào)函數(shù)返回非None
值,它將用作響應(yīng)并替換原始的響應(yīng)對(duì)象(以及傳遞給下一個(gè)渲染之后的回調(diào)函數(shù),以此類(lèi)推)。
SimpleTemplateResponse.render()[source]
設(shè)置response.content
為SimpleTemplateResponse.rendered_content
的結(jié)果,執(zhí)行所有渲染之后的回調(diào)函數(shù),最后返回生成的響應(yīng)對(duì)象。
render()
只在第一次調(diào)用它時(shí)其作用。以后的調(diào)用將返回第一次調(diào)用的結(jié)果。
class TemplateResponse[source]
TemplateResponse
是SimpleTemplateResponse
的子類(lèi),而且能知道當(dāng)前的HttpRequest
。
TemplateResponse.__init__(request, template, context=None, content_type=None, status=None, current_app=None, charset=None, using=None)[source]
使用給定的模板、上下文、Content-Type
、HTTP 狀態(tài)和字符集實(shí)例化一個(gè)TemplateResponse
對(duì)象。
request
An HttpRequest
instance.
template
一個(gè)與后端有關(guān)的模板對(duì)象(例如get_template()
返回的對(duì)象)、模板的名稱(chēng)或者一個(gè)模板名稱(chēng)列表。
Deprecated since version 1.8:
template 以前只接受一個(gè)Template。
context
一個(gè)dict
,包含要添加到模板上下文中的值。 它默認(rèn)是一個(gè)空的字典。
Deprecated since version 1.8:
context 以前只接受一個(gè)Context。
content_type
HTTP Content-Type
頭部包含的值,包含MIME 類(lèi)型和字符集的編碼。如果指定content_type
,則使用它的值。否則,使用DEFAULT_CONTENT_TYPE
。
status
響應(yīng)的HTTP 狀態(tài)碼。
current_app
包含當(dāng)前視圖的應(yīng)用。更多信息,參見(jiàn)帶命名空間的URL 解析策略。
Deprecated since version 1.8:
廢棄current_app 參數(shù)。你應(yīng)該去設(shè)置request.current_app。
charset
響應(yīng)編碼使用的字符集。如果沒(méi)有給出則從content_type中提取,如果提取不成功則使用 DEFAULT_CHARSET 設(shè)置。
using
加載模板使用的模板引擎的名稱(chēng)。
Changed in Django 1.8:
添加charset 和using 參數(shù)。
在TemplateResponse
實(shí)例返回給客戶(hù)端之前,它必須被渲染。渲染的過(guò)程采用模板和上下文變量的中間表示形式,并最終將它轉(zhuǎn)換為可以發(fā)送給客戶(hù)端的字節(jié)流。
三種情況下會(huì)渲染TemplateResponse
:
TemplateResponse
只能渲染一次。SimpleTemplateResponse.render()
的第一次調(diào)用設(shè)置響應(yīng)的內(nèi)容;以后的響應(yīng)不會(huì)改變響應(yīng)的內(nèi)容。
然而,當(dāng)顯式給response.content
賦值時(shí),修改會(huì)始終生效。如果你想強(qiáng)制重新渲染內(nèi)容,你可以重新計(jì)算渲染的內(nèi)容并手工賦值給響應(yīng)的內(nèi)容:
# 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
某些操作 —— 例如緩存 —— 不可以在沒(méi)有渲染的模板上執(zhí)行。它們必須在完整的渲染后的模板上執(zhí)行。
如果你正在使用中間件,解決辦法很容易。中間件提供多種在從視圖退出時(shí)處理響應(yīng)的機(jī)會(huì)。如果你向響應(yīng)中間件添加一些行為,它們將保證在模板渲染之后執(zhí)行。
然而,如果正在使用裝飾器,就不會(huì)有這樣的機(jī)會(huì)。裝飾器中定義的行為會(huì)立即執(zhí)行。
為了補(bǔ)償這一點(diǎn)(以及其它類(lèi)似的使用情形)TemplateResponse
允許你注冊(cè)在渲染完成時(shí)調(diào)用的回調(diào)函數(shù)。使用這個(gè)回調(diào)函數(shù),你可以延遲某些關(guān)鍵的處理直到你可以保證渲染后的內(nèi)容是可以訪(fǎng)問(wèn)的。
要定義渲染后的回調(diào)函數(shù),只需定義一個(gè)接收一個(gè)響應(yīng)作為參數(shù)的函數(shù)并將這個(gè)函數(shù)注冊(cè)到模板響應(yīng)中:
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()
將在mytemplate.html
渲染之后調(diào)用,并將被傳遞一個(gè)TemplateResponse
實(shí)例作為參數(shù)。
如果模板已經(jīng)渲染,回調(diào)函數(shù)將立即執(zhí)行。
TemplateResponse
對(duì)象和普通的django.http.HttpResponse
一樣可以用于任何地方。它可以用來(lái)作為render()
和render_to_response()
的另外一種選擇。
例如,下面這個(gè)簡(jiǎn)單的視圖使用一個(gè)簡(jiǎn)單模板和包含查詢(xún)集的上下文返回一個(gè)TemplateResponse
:
from django.template.response import TemplateResponse
def blog_index(request):
return TemplateResponse(request, 'entry_list.html', {'entries': Entry.objects.all()})
譯者:Django 文檔協(xié)作翻譯小組,原文:TemplateResponse objects。
本文以 CC BY-NC-SA 3.0 協(xié)議發(fā)布,轉(zhuǎn)載請(qǐng)保留作者署名和文章出處。
Django 文檔協(xié)作翻譯小組人手緊缺,有興趣的朋友可以加入我們,完全公益性質(zhì)。交流群:467338606。