TemplateResponseおよびSimpleTemplateResponse—Djangoのドキュメント
TemplateResponseおよびSimpleTemplateResponse
標準の 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)
- 指定されたテンプレート、コンテキスト、コンテンツタイプ、HTTPステータス、および文字セットを使用して SimpleTemplateResponse オブジェクトをインスタンス化します。
template
- バックエンドに依存するテンプレートオブジェクト( get_template()によって返されるものなど)、テンプレートの名前、またはテンプレート名のリスト。
context
- テンプレートコンテキストに追加する値の
dict
。 デフォルトでは、これは空の辞書です。 content_type
- HTTP
Content-Type
ヘッダーに含まれる値。これには、MIMEタイプの指定と文字セットのエンコードが含まれます。content_type
が指定されている場合、その値が使用されます。 それ以外の場合は、'text/html'
が使用されます。 status
- 応答のHTTPステータスコード。
charset
- 応答がエンコードされる文字セット。 指定しない場合は
content_type
から抽出され、失敗した場合は:setting: `DEFAULT_CHARSET` 設定が使用されます。 using
- NS :setting: `NAME ` テンプレートのロードに使用するテンプレートエンジンの例。
- SimpleTemplateResponse.resolve_context(context)
テンプレートのレンダリングに使用されるコンテキストデータを前処理します。 コンテキストデータの
dict
を受け入れます。 デフォルトでは、同じdict
を返します。コンテキストをカスタマイズするには、このメソッドをオーバーライドします。
- SimpleTemplateResponse.resolve_template(template)
レンダリングに使用するテンプレートインスタンスを解決します。 バックエンドに依存するテンプレートオブジェクト( get_template()によって返されるものなど)、テンプレートの名前、またはテンプレート名のリストを受け入れます。
レンダリングされるバックエンド依存のテンプレートオブジェクトインスタンスを返します。
テンプレートの読み込みをカスタマイズするには、このメソッドをオーバーライドします。
- SimpleTemplateResponse.add_post_render_callback()
レンダリングが行われた後に呼び出されるコールバックを追加します。 このフックは、レンダリングが行われるまで、特定の処理操作(キャッシュなど)を延期するために使用できます。
SimpleTemplateResponse がすでにレンダリングされている場合、コールバックはすぐに呼び出されます。
呼び出されると、コールバックには1つの引数(レンダリングされた SimpleTemplateResponse インスタンス)が渡されます。
コールバックが
None
以外の値を返す場合、これは元の応答オブジェクトの代わりに応答として使用されます(そして、次のレンダリング後のコールバックなどに渡されます)。
- SimpleTemplateResponse.render()
response.content
を SimpleTemplateResponse.rendered_content によって取得された結果に設定し、すべてのレンダリング後のコールバックを実行して、結果の応答オブジェクトを返します。render()
は、最初に呼び出されたときにのみ効果があります。 以降の呼び出しでは、最初の呼び出しから取得した結果が返されます。
TemplateResponseオブジェクト
- class TemplateResponse
TemplateResponse
は、現在の HttpRequest を認識している SimpleTemplateResponse のサブクラスです。
メソッド
- TemplateResponse.__init__(request, template, context=None, content_type=None, status=None, charset=None, using=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
から抽出され、失敗した場合は:setting: `DEFAULT_CHARSET` 設定が使用されます。 using
- NS :setting: `NAME ` テンプレートのロードに使用するテンプレートエンジンの例。
レンダリングプロセス
TemplateResponse インスタンスをクライアントに返す前に、レンダリングする必要があります。 レンダリングプロセスは、テンプレートとコンテキストの中間表現を取得し、それをクライアントに提供できる最終的なバイトストリームに変換します。
TemplateResponse
がレンダリングされる状況は3つあります。
TemplateResponse
インスタンスが明示的にレンダリングされる場合、 SimpleTemplateResponse.render()メソッドを使用します。response.content
を割り当てて応答内容を明示的に設定した場合。- テンプレート応答ミドルウェアを通過した後、応答ミドルウェアを通過する前。
TemplateResponse
は1回しかレンダリングできません。 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()})