TemplateResponseSimpleTemplateResponse

標準的 HttpResponse 物件是靜態結構。它們在建構時會被提供一個預先渲染的內容區塊,雖然該內容可以被修改,但其形式並不容易進行修改。

然而,有時允許裝飾器或中介軟體在視圖建構回應修改回應可能是有益的。例如,您可能想要變更所使用的範本,或將額外的資料放入內容中。

TemplateResponse 提供了一種方法來做到這一點。與基本的 HttpResponse 物件不同,TemplateResponse 物件保留了視圖提供的範本和內容的詳細資訊,以計算回應。回應的最終輸出要到回應流程的稍後階段才需要計算。

SimpleTemplateResponse 物件

class SimpleTemplateResponse[原始碼]

屬性

SimpleTemplateResponse.template_name

要渲染的範本名稱。接受後端相依的範本物件(例如由 get_template() 返回的物件)、範本名稱或範本名稱列表。

範例:['foo.html', 'path/to/bar.html']

SimpleTemplateResponse.context_data

渲染範本時要使用的內容資料。它必須是一個 dict

範例:{'foo': 123}

SimpleTemplateResponse.rendered_content[原始碼]

使用當前範本和內容資料的回應內容的目前渲染值。

SimpleTemplateResponse.is_rendered[原始碼]

一個布林值,表示回應內容是否已渲染。

方法

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[原始碼]

TemplateResponseSimpleTemplateResponse 的子類別,它了解目前的 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 實例作為引數提供。

如果樣板已經渲染,則會立即調用回呼。

使用 TemplateResponseSimpleTemplateResponse

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()}
    )
返回頂部