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)[ソース]¶ SimpleTemplateResponse
オブジェクトを、与えられたテンプレート、コンテキスト、コンテンツタイプ、HTTP ステータス、文字コードでインスタンス化します。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)[ソース]¶ TemplateResponse
オブジェクトを、与えられたリクエスト、テンプレート、コンテキスト、コンテンツタイプ、HTTP ステータス、文字コードでインスタンス化します。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
がレンダリングされる状況は3つあります:
- TemplateResponse インスタンスが
SimpleTemplateResponse.render()
メソッドを使用して明示的にレンダリングされた場合。 - レスポンスの内容を
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
ではレンダリングが完了したときに呼び出されるコールバックを登録できます。このコールバックを使うことで、レンダリングされたコンテンツが利用可能になるまで、重要な処理を延期できます。
レンダリング後のコールバックを定義するには、response を引数に取る関数を定義し、その関数をテンプレートの 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()
は mytemplate.html
がレンダリングされた後に呼び出され、完全にレンダリングされた 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()}
)