TemplateResponseおよびSimpleTemplateResponse—Djangoのドキュメント

提供:Dev Guides
< DjangoDjango/docs/3.2.x/ref/template-response
移動先:案内検索

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, headers=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 ` テンプレートのロードに使用するテンプレートエンジンの例。

headers

応答に追加するHTTPヘッダーのdict

バージョン3.2で変更: headersパラメーターが追加されました。

SimpleTemplateResponse.resolve_context(context)

テンプレートのレンダリングに使用されるコンテキストデータを前処理します。 コンテキストデータのdictを受け入れます。 デフォルトでは、同じdictを返します。

コンテキストをカスタマイズするには、このメソッドをオーバーライドします。

SimpleTemplateResponse.resolve_template(template)

レンダリングに使用するテンプレートインスタンスを解決します。 バックエンドに依存するテンプレートオブジェクト( get_template()によって返されるものなど)、テンプレートの名前、またはテンプレート名のリストを受け入れます。

レンダリングされるバックエンド依存のテンプレートオブジェクトインスタンスを返します。

テンプレートの読み込みをカスタマイズするには、このメソッドをオーバーライドします。

SimpleTemplateResponse.add_post_render_callback()

レンダリングが行われた後に呼び出されるコールバックを追加します。 このフックは、レンダリングが行われるまで、特定の処理操作(キャッシュなど)を延期するために使用できます。

SimpleTemplateResponse がすでにレンダリングされている場合、コールバックはすぐに呼び出されます。

呼び出されると、コールバックには1つの引数(レンダリングされた SimpleTemplateResponse インスタンス)が渡されます。

コールバックがNone以外の値を返す場合、これは元の応答オブジェクトの代わりに応答として使用されます(そして、次のレンダリング後のコールバックなどに渡されます)。

SimpleTemplateResponse.render()

response.contentSimpleTemplateResponse.rendered_content によって取得された結果に設定し、すべてのレンダリング後のコールバックを実行して、結果の応答オブジェクトを返します。

render()は、最初に呼び出されたときにのみ効果があります。 以降の呼び出しでは、最初の呼び出しから取得した結果が返されます。


TemplateResponseオブジェクト

class TemplateResponse
TemplateResponseは、現在の HttpRequest を認識している SimpleTemplateResponse のサブクラスです。

メソッド

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から抽出され、失敗した場合は:setting: `DEFAULT_CHARSET` 設定が使用されます。

using

NS :setting: `NAME ` テンプレートのロードに使用するテンプレートエンジンの例。

headers

応答に追加するHTTPヘッダーのdict

バージョン3.2で変更: headersパラメーターが追加されました。


レンダリングプロセス

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()})