レスポンス
基本的なHttpResponseオブジェクトとは異なり、TemplateResponseオブジェクトは、レスポンスを計算するためにビューによって提供されたコンテキストの詳細を保持します。レスポンスの最終的な出力は、レスポンスプロセスの後で必要になるまで計算されません。
REST frameworkは、クライアントのリクエストに応じて複数のコンテンツタイプにレンダリングできるコンテンツを返すことができる`Response`クラスを提供することにより、HTTPコンテンツネゴシエーションをサポートしています。
`Response`クラスはDjangoの`SimpleTemplateResponse`をサブクラス化しています。`Response`オブジェクトはデータで初期化されます。これは、ネイティブのPythonプリミティブで構成される必要があります。その後、REST frameworkは標準的なHTTPコンテンツネゴシエーションを使用して、最終的なレスポンスコンテンツをどのようにレンダリングするべきかを決定します。
`Response`クラスを使用する必要はありません。必要に応じて、ビューから通常の`HttpResponse`または`StreamingHttpResponse`オブジェクトを返すこともできます。`Response`クラスを使用すると、複数のフォーマットにレンダリングできるコンテンツネゴシエーションされたWeb APIレスポンスを返すためのより良いインターフェースが提供されます。
何らかの理由でREST frameworkを大幅にカスタマイズしない限り、`Response`オブジェクトを返すビューには常に`APIView`クラスまたは`@api_view`関数を使用する必要があります。これにより、ビューはコンテンツネゴシエーションを実行し、ビューから返される前にレスポンスに適切なレンダラーを選択できるようになります。
レスポンスの作成
Response()
シグネチャ: Response(data, status=None, template_name=None, headers=None, content_type=None)
通常の`HttpResponse`オブジェクトとは異なり、レンダリングされたコンテンツを使用して`Response`オブジェクトをインスタンス化しません。代わりに、レンダリングされていないデータを渡します。これは、任意のPythonプリミティブで構成できます。
`Response`クラスで使用されるレンダラーは、Djangoモデルインスタンスなどの複雑なデータ型をネイティブに処理できないため、`Response`オブジェクトを作成する前に、データをプリミティブデータ型にシリアライズする必要があります。
このデータシリアライゼーションを実行するためにREST frameworkの`Serializer`クラスを使用するか、独自ののカスタムシリアライゼーションを使用できます。
引数
- `data`: レスポンスのシリアライズされたデータ。
- `status`: レスポンスのステータスコード。デフォルトは200です。ステータスコードも参照してください。
- `template_name`: `HTMLRenderer`が選択されている場合に使用するテンプレート名。
- `headers`: レスポンスで使用されるHTTPヘッダーの辞書。
- `content_type`: レスポンスのコンテンツタイプ。通常、これはコンテンツネゴシエーションによって決定されたレンダラーによって自動的に設定されますが、コンテンツタイプを明示的に指定する必要がある場合もあります。
属性
.data
レスポンスのレンダリングされていない、シリアライズされたデータ。
.status_code
HTTPレスポンスの数値ステータスコード。
.content
レスポンスのレンダリングされたコンテンツ。`.content`にアクセスするには、`.render()`メソッドを呼び出す必要があります。
.template_name
指定されている場合の`template_name`。`HTMLRenderer`またはその他のカスタムテンプレートレンダラーがレスポンスの承認されたレンダラーである場合にのみ必要です。
.accepted_renderer
レスポンスのレンダリングに使用されるレンダラーインスタンス。
ビューからレスポンスが返される直前に、`APIView`または`@api_view`によって自動的に設定されます。
.accepted_media_type
コンテンツネゴシエーションステージによって選択されたメディアタイプ。
ビューからレスポンスが返される直前に、`APIView`または`@api_view`によって自動的に設定されます。
.renderer_context
レンダラーの`.render()`メソッドに渡される追加のコンテキスト情報の辞書。
ビューからレスポンスが返される直前に、`APIView`または`@api_view`によって自動的に設定されます。
標準的なHttpResponse属性
`Response`クラスは`SimpleTemplateResponse`を拡張しており、通常のすべての属性とメソッドもレスポンスで使用できます。たとえば、標準的な方法でレスポンスにヘッダーを設定できます。
response = Response()
response['Cache-Control'] = 'no-cache'
.render()
シグネチャ: .render()
他の`TemplateResponse`と同様に、このメソッドは、レスポンスのシリアライズされたデータを最終的なレスポンスコンテンツにレンダリングするために呼び出されます。`.render()`が呼び出されると、レスポンスコンテンツは、`accepted_renderer`インスタンスで`.render(data, accepted_media_type, renderer_context)`メソッドを呼び出した結果に設定されます。
通常、自分で`.render()`を呼び出す必要はありません。Djangoの標準的なレスポンスサイクルによって処理されます。