request.py

リクエスト

RESTベースのウェブサービスを作成している場合…`request.POST`は無視するべきです。

— マルクム・トレディニック、Django developers group

REST frameworkの`Request`クラスは標準の`HttpRequest`を拡張し、REST frameworkの柔軟なリクエストパースとリクエスト認証をサポートしています。


リクエストパース

REST frameworkのRequestオブジェクトは、柔軟なリクエストパースを提供します。これにより、JSONデータやその他のメディアタイプのリクエストを、通常フォームデータを取り扱うのと同様に扱うことができます。

.data

request.dataは、リクエストボディの解析済みコンテンツを返します。これは標準のrequest.POSTおよびrequest.FILES属性に似ていますが、以下の点が異なります。

  • ファイルとファイル以外の入力を含む、すべての解析済みコンテンツが含まれます。
  • POST以外のHTTPメソッドのコンテンツの解析をサポートしています。つまり、PUTPATCHリクエストのコンテンツにアクセスできます。
  • フォームデータのサポートだけでなく、REST frameworkの柔軟なリクエストパースをサポートしています。たとえば、受信したJSONデータを、受信したフォームデータを処理する方法と同様に処理できます。

詳細については、パーサーのドキュメントを参照してください。

.query_params

request.query_paramsは、request.GETのより正確な名前の同義語です。

コードの明確さのために、Djangoの標準的なrequest.GETの代わりにrequest.query_paramsを使用することをお勧めします。これにより、コードベースをより正確で分かりやすくすることができます。任意のHTTPメソッドタイプはクエリパラメータを含めることができ、`GET`リクエストだけではありません。

.parsers

APIViewクラスまたは@api_viewデコレータは、ビューに設定されたparser_classesに基づいて、またはDEFAULT_PARSER_CLASSES設定に基づいて、このプロパティが`Parser`インスタンスのリストに自動的に設定されるようにします。

通常、このプロパティにアクセスする必要はありません。


注: クライアントが不正なコンテンツを送信した場合、request.dataにアクセスするとParseErrorが発生する可能性があります。デフォルトでは、REST frameworkのAPIViewクラスまたは@api_viewデコレータはエラーをキャッチし、400 Bad Requestレスポンスを返します。

クライアントが解析できないコンテンツタイプのリクエストを送信した場合、UnsupportedMediaType例外が発生します。これはデフォルトでキャッチされ、415 Unsupported Media Typeレスポンスが返されます。


コンテンツネゴシエーション

リクエストは、コンテンツネゴシエーション段階の結果を判断できるいくつかのプロパティを公開しています。これにより、異なるメディアタイプに対して異なるシリアライゼーションスキームを選択するなどの動作を実装できます。

.accepted_renderer

コンテンツネゴシエーション段階で選択されたレンダラーインスタンス。

.accepted_media_type

コンテンツネゴシエーション段階で承認されたメディアタイプを表す文字列。


認証

REST frameworkは、柔軟なリクエストごとの認証を提供し、以下のようなことが可能です。

  • APIの異なる部分に対して異なる認証ポリシーを使用する。
  • 複数の認証ポリシーの使用をサポートする。
  • 受信リクエストに関連付けられたユーザー情報とトークン情報の両方を提供する。

.user

request.userは通常、django.contrib.auth.models.Userのインスタンスを返しますが、動作は使用されている認証ポリシーによって異なります。

リクエストが認証されていない場合、request.userのデフォルト値はdjango.contrib.auth.models.AnonymousUserのインスタンスです。

詳細については、認証ドキュメントを参照してください。

.auth

request.authは、追加の認証コンテキストを返します。request.authの正確な動作は使用されている認証ポリシーによって異なりますが、通常はリクエストが認証されたトークンのインスタンスです。

リクエストが認証されていない場合、または追加のコンテキストが存在しない場合、request.authのデフォルト値はNoneです。

詳細については、認証ドキュメントを参照してください。

.authenticators

APIViewクラスまたは@api_viewデコレータは、ビューに設定されたauthentication_classesに基づいて、またはDEFAULT_AUTHENTICATORS設定に基づいて、このプロパティが`Authentication`インスタンスのリストに自動的に設定されるようにします。

通常、このプロパティにアクセスする必要はありません。


注: `.user`または`.auth`プロパティを呼び出す際に`WrappedAttributeError`が発生することがあります。これらのエラーは、標準の`AttributeError`としてオーセンティケーターから発生しますが、外側のプロパティアクセスによって抑制されるのを防ぐために、異なる例外タイプとして再発生させる必要があります。Pythonは`AttributeError`がオーセンティケーターから発生したことを認識せず、代わりにリクエストオブジェクトに`.user`または`.auth`プロパティがないと想定します。オーセンティケーターを修正する必要があります。


ブラウザ拡張機能

REST frameworkは、ブラウザベースのPUTPATCHDELETEフォームなどのいくつかのブラウザ拡張機能をサポートしています。

.method

request.methodは、リクエストのHTTPメソッドの大文字と小文字を区別しない文字列表現を返します。

ブラウザベースのPUTPATCHDELETEフォームは透過的にサポートされています。

詳細については、ブラウザ拡張機能のドキュメントを参照してください。

.content_type

request.content_typeは、HTTPリクエストボディのメディアタイプを表す文字列オブジェクトを返します。メディアタイプが提供されていない場合は空文字列を返します。

通常、REST frameworkのデフォルトのリクエストパース動作に依存するため、リクエストのコンテンツタイプに直接アクセスする必要はありません。

リクエストのコンテンツタイプにアクセスする必要がある場合は、ブラウザベースの非フォームコンテンツに対する透過的なサポートを提供するため、request.META.get('HTTP_CONTENT_TYPE')を使用する代わりに、`.content_type`プロパティを使用する必要があります。

詳細については、ブラウザ拡張機能のドキュメントを参照してください。

.stream

request.streamは、リクエストボディのコンテンツを表すストリームを返します。

通常、REST frameworkのデフォルトのリクエストパース動作に依存するため、リクエストのコンテンツに直接アクセスする必要はありません。


標準的なHttpRequest属性

REST frameworkの`Request`はDjangoの`HttpRequest`を拡張しているため、他の標準的な属性とメソッドも使用できます。たとえば、`request.META`と`request.session`ディクショナリは通常どおり使用できます。

実装上の理由から、`Request`クラスは`HttpRequest`クラスを継承しませんが、コンポジションを使用してクラスを拡張することに注意してください。