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)

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.contentSimpleTemplateResponse.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)

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()}
    )
Back to Top