鍍金池/ 教程/ Python/ TemplateResponse 和 SimpleTemplateResponse
點(diǎn)擊劫持保護(hù)
安全問(wèn)題歸檔
Model 類(lèi)參考
將遺留數(shù)據(jù)庫(kù)整合到Django
關(guān)聯(lián)對(duì)象參考
內(nèi)建基于類(lèi)的視圖的API
聚合
Django 中的用戶(hù)認(rèn)證
django.contrib.humanize
Django管理文檔生成器
分頁(yè)
使用Django輸出CSV
加密簽名
文件儲(chǔ)存API
安全
Django中的測(cè)試
國(guó)際化和本地化
為Django編寫(xiě)首個(gè)補(bǔ)丁
條件表達(dá)式
日志
模型元選項(xiàng)
部署靜態(tài)文件
執(zhí)行查詢(xún)
使用Django認(rèn)證系統(tǒng)
基于類(lèi)的視圖
中間件
編寫(xiě)自定義的django-admin命令
Django 的設(shè)置
格式本地化
數(shù)據(jù)庫(kù)訪(fǎng)問(wèn)優(yōu)化
錯(cuò)誤報(bào)告
基于類(lèi)的內(nèi)建通用視圖
編寫(xiě)自定義存儲(chǔ)系統(tǒng)
編寫(xiě)你的第一個(gè) Django 程序 第3部分
編寫(xiě)數(shù)據(jù)庫(kù)遷移
使用表單
編寫(xiě)你的第一個(gè) Django 程序 第2部分
編寫(xiě)你的第一個(gè) Django 程序 第1部分
如何使用會(huì)話(huà)
系統(tǒng)檢查框架
新手入門(mén)
信號(hào)
編寫(xiě)視圖
如何使用WSGI 部署
編寫(xiě)你的第一個(gè)Django應(yīng)用,第6部分
常見(jiàn)的網(wǎng)站應(yīng)用工具
Widgets
內(nèi)建的視圖
模型實(shí)例參考
視圖層
Django中的密碼管理
高級(jí)教程:如何編寫(xiě)可重用的應(yīng)用
國(guó)際化和本地化
"本地特色"附加功能
TemplateResponse 和 SimpleTemplateResponse
模式編輯器
文件上傳
快速安裝指南
部署 Django
表單 API
表單素材 ( <code>Media</code> 類(lèi))
管理文件
其它核心功能
查找 API 參考
表單
Admin
數(shù)據(jù)庫(kù)函數(shù)
自定義查找
使用基于類(lèi)的視圖處理表單
管理操作
開(kāi)發(fā)過(guò)程
編寫(xiě)你的第一個(gè)Django應(yīng)用,第5部分
進(jìn)行原始的sql查詢(xún)
模型層
多數(shù)據(jù)庫(kù)
編寫(xiě)你的第一個(gè) Django 程序 第4部分
Django安全
Django 初探
Django異常
重定向應(yīng)用
按需內(nèi)容處理
管理器
視圖裝飾器
驗(yàn)證器
使用Django輸出PDF
File對(duì)象
Django 的快捷函數(shù)
基于類(lèi)的通用視圖 —— 索引
為模型提供初始數(shù)據(jù)
模板層
URL調(diào)度器
中間件
模型

TemplateResponse 和 SimpleTemplateResponse

標(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ì)算。

SimpleTemplateResponse 對(duì)象

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.contentSimpleTemplateResponse.rendered_content 的結(jié)果,執(zhí)行所有渲染之后的回調(diào)函數(shù),最后返回生成的響應(yīng)對(duì)象。

render() 只在第一次調(diào)用它時(shí)其作用。以后的調(diào)用將返回第一次調(diào)用的結(jié)果。

TemplateResponse 對(duì)象

class TemplateResponse[source]

TemplateResponseSimpleTemplateResponse 的子類(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ù)。

渲染的過(guò)程

TemplateResponse 實(shí)例返回給客戶(hù)端之前,它必須被渲染。渲染的過(guò)程采用模板和上下文變量的中間表示形式,并最終將它轉(zhuǎn)換為可以發(fā)送給客戶(hù)端的字節(jié)流。

三種情況下會(huì)渲染TemplateResponse

  • 當(dāng)使用SimpleTemplateResponse.render() 方法顯示渲染TemplateResponse 實(shí)例的時(shí)候。
  • 當(dāng)通過(guò)給response.content 賦值顯式設(shè)置響應(yīng)內(nèi)容的時(shí)候。
  • 在應(yīng)用模板響應(yīng)中間件之后,應(yīng)用響應(yīng)中間件之前。

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

渲染后的回調(diào)函數(shù)

某些操作 —— 例如緩存 —— 不可以在沒(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 和SimpleTemplateResponse

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。