リクエスト
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メソッドのコンテンツの解析をサポートしています。つまり、PUT
とPATCH
リクエストのコンテンツにアクセスできます。- フォームデータのサポートだけでなく、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は、ブラウザベースのPUT
、PATCH
、DELETE
フォームなどのいくつかのブラウザ拡張機能をサポートしています。
.method
request.method
は、リクエストのHTTPメソッドの大文字と小文字を区別しない文字列表現を返します。
ブラウザベースのPUT
、PATCH
、DELETE
フォームは透過的にサポートされています。
詳細については、ブラウザ拡張機能のドキュメントを参照してください。
.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`クラスを継承しませんが、コンポジションを使用してクラスを拡張することに注意してください。