リクエストとレスポンスのオブジェクト¶
簡単な概要¶
Django は、システムを通じてステータスを渡すために、リクエストとレスポンスのオブジェクトを使います。
あるページがリクエストされたとき、Django はリクエストに関するメタデータを含んだ HttpRequest オブジェクトを生成します。それから Django は HttpRequest をビュー関数の最初の関数として渡し、適切なビューを読み込みます。あらゆるビューは HttpResponse オブジェクトを返す必要があります。
このドキュメントでは、HttpRequest と HttpResponse オブジェクトの API を説明しています。これは django.http モジュールにて定義されています。
HttpRequest オブジェクト¶
属性¶
特に記載がない限り、全ての属性は読み取り専用だと考えてください。
- HttpRequest.body[ソース]¶
生の HTTP リクエストボディをバイト文字列として。これは、従来の HTML フォームとは異なる方法でデータを処理するのに便利です:バイナリイメージ、XML ペイロードなど。従来のフォームデータを処理する場合は、
HttpRequest.POSTを使用してください。HttpRequest.read()やHttpRequest.readline()を用いて、ファイルのようなインタフェースからHttpRequestを読み取ることもできます。これらの I/O ストリームメソッドを用いてリクエストを読み取った 後にbody属性にアクセスすると、RawPostDataExceptionが発生します。
- HttpRequest.path¶
要求されたページへのフルパスを表す文字列であり、scheme、ドメイン、クエリ文字列は含みません。
例:
"/music/bands/the_beatles/"
- HttpRequest.path_info¶
一部のWebサーバー構成では、ホスト名の後のURLがスクリプトプレフィックス部分とパス情報部分に分割されます。
path_info属性は、使用されるWebサーバーに関わらず常にパス情報部分を含んでいます。これをpathの代わりに使用することで、テストサーバーとデプロイメントサーバー間でコードを移動させやすくなります。たとえば、アプリケーションの
WSGIScriptAliasが"/minfo"に設定されている場合、pathが"/minfo/music/bands/the_beatles/"である一方、path_infoは"/music/bands/the_beatles/"となる可能性があります。
- HttpRequest.method¶
リクエストで使用された HTTP メソッドを表す文字列です。この値は常に大文字となることが保証されています。たとえば、次のようになります。
if request.method == "GET": do_something() elif request.method == "POST": do_something_else()
- HttpRequest.encoding[ソース]¶
フォーム提出データをデコードする際に使用されている現在のエンコーディングを表す文字列(または
Noneで、これはDEFAULT_CHARSET設定が使用されることを意味します)。この属性に書き込むことで、フォームデータにアクセスする際に使用されるエンコーディングを変更できます。その後の属性アクセス(GETやPOSTからの読み取りなど)は、新しいencoding値を使用します。フォームデータがDEFAULT_CHARSETエンコーディングでないことがわかっている場合に便利です。
- HttpRequest.content_type¶
リクエストの MIME タイプを表す文字列です。
CONTENT_TYPEから識別されます。
- HttpRequest.content_params¶
CONTENT_TYPEヘッダに含まれる、キーと値のパラーメータのディクショナリです。
- HttpRequest.POST¶
リクエストにフォームデータが含まれている場合に、すべての与えられた HTTP POST パラメータを含む辞書のようなオブジェクト。以下の
QueryDictドキュメントを参照してください。リクエストにポストされた生のデータや非フォームデータにアクセスする必要がある場合は、代わりにHttpRequest.body属性を通じてアクセスしてください。POST メソッドでフォームデータが含まれていない場合に、空の
POSTディクショナリを備えたリクエストが発生する可能性があります。そのため、POST メソッドの使用を確認するためにif request.POSTを使用すべきではありません。代わりに、if request.method == "POST"を使用してください (HttpRequest.methodを参照)。POSTには file-upload の情報が含まれ ません 。詳しくはFILESを参照してください。
- HttpRequest.COOKIES¶
すべてのクッキーが格納されたディクショナリです。キーと値は文字列です。
- HttpRequest.FILES¶
FILESは、アップロードされた全てのファイルを含む辞書型のオブジェクトです。FILESの各キーは<input type="file" name="">のnameから成ります。FILESの各値はUploadedFileです。詳細については、ファイルの管理 を参照してください。
FILESには、リクエストメソッドが POST で、リクエストに投稿した<form>にenctype="multipart/form-data"が設定されていた場合にのみデータが含まれます。それ以外の場合、FILESは空の辞書のようなオブジェクトになります。
- HttpRequest.META¶
利用できるすべての HTTP ヘッダーが格納されたディクショナリです。利用可能なヘッダーはクライアントとサーバーによって異なりますが、以下に例を示します。
CONTENT_LENGTH-- リクエスト本文の (文字列としての) 長さです。CONTENT_TYPE-- リクエスト本文の MIME タイプです。HTTP_ACCEPT-- レスポンスに対して受け入れ可能なコンテンツのタイプです。HTTP_ACCEPT_ENCODING-- レスポンスに対して受け入れ可能なエンコーディングです。HTTP_ACCEPT_LANGUAGE-- レスポンスに対して受け入れ可能な言語です。HTTP_HOST-- クライアントによって送信された HTTP Host ヘッダです。HTTP_REFERER-- (存在する場合) リファラページです。HTTP_USER_AGENT-- クライアントのユーザエージェント文字列です。QUERY_STRING-- クエリ文字列で、単一の (未解析の) 文字列です。REMOTE_ADDR-- クライアントの IP アドレスです。REMOTE_HOST-- クライアントのホスト名です。REMOTE_USER-- ウェブサーバーによって認証されたユーザー(もしあれば)。REQUEST_METHOD--"GET"や"POST"といったです。SERVER_NAME-- サーバのホスト名です。SERVER_PORT-- (文字列としての) サーバのポートです。
上記の
CONTENT_LENGTHとCONTENT_TYPEを除き、リクエストの HTTP ヘッダーは、すべての文字を大文字に変換し、ハイフンをアンダースコアに置き換え、名前にHTTP_プレフィックスを追加することでMETAキーに変換されます。たとえば、X-BenderというヘッダーはMETAキーHTTP_X_BENDERにマッピングされます。runserverでは、名前にアンダースコアを含むヘッダーはすべて削除されるため、METAにそれらが表示されません。これにより、WSGI 環境変数内のアンダースコアとダッシュの曖昧さに基づくヘッダー・スプーフィングが防がれます。この動作は、Nginx や Apache 2.4+ のようなウェブサーバーと一致しています。HttpRequest.headersはCONTENT_LENGTHとCONTENT_TYPEを含む、全てのHTTPプレフィックス付きヘッダーにアクセスするより簡単な方法です。
- HttpRequest.headers[ソース]¶
リクエストからHTTPプリフィックスヘッダー全体 (
Content-LengthとContent-Typeを含む) にアクセスを提供する、大文字小文字を区別しない辞書風オブジェクトです。各ヘッダーの名前は、表示される際にタイトルケース (例:
User-Agent) でスタイリズされます。ヘッダーは大文字小文字を区別せずにアクセスできます。>>> request.headers {'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6', ...} >>> "User-Agent" in request.headers True >>> "user-agent" in request.headers True >>> request.headers["User-Agent"] Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) >>> request.headers["user-agent"] Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) >>> request.headers.get("User-Agent") Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) >>> request.headers.get("user-agent") Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6)
たとえば Django テンプレートでの使用において、ヘッダーはハイフンの代わりにアンダースコアを使用してもルックアップできます。
{{ request.headers.user_agent }}
- HttpRequest.resolver_match¶
解決されたURLを表す
ResolverMatchのインスタンスです。この属性は、URLの解決が行われた後にのみ設定されます。つまり、全てのビューで利用可能ですが、URLの解決が行われる前に実行されるミドルウェアでは利用できません (process_view()では使用できます)。
アプリケーションコードがセットする属性¶
Django はこれらの属性を自分で設定することはありませんが、アプリケーション側で設定された場合にはその値を利用します。
- HttpRequest.current_app¶
The
urltemplate tag will use its value as thecurrent_appargument toreverse().
- HttpRequest.urlconf¶
この値は、現在のリクエストに対する root URLconf として使用され、設定の
ROOT_URLCONFを上書きします。詳しくは Django のリクエスト処理 を参照してください。urlconfはNoneに設定することで、それまでにミドルウェアで行われた変更を取り消し、元のROOT_URLCONFを使用するようにできます。
- HttpRequest.exception_reporter_filter¶
これは、現在のリクエストに対して
DEFAULT_EXCEPTION_REPORTER_FILTERの代わりに使用されます。詳細については、 カスタムエラーレポート を参照してください。
- HttpRequest.exception_reporter_class¶
これは、現在のリクエストに対して
DEFAULT_EXCEPTION_REPORTERの代わりに使用されます。詳細については カスタムエラーレポート を参照してください。
ミドルウェアが設定する属性¶
Django の contrib アプリなどのミドルウェアの一部は、リクエストに属性を設定します。もし、リクエストに属性が設定されていない場合は、MIDDLEWARE リスト中に適切なミドルウェアが含まれているかを確認してください。
- HttpRequest.session¶
SessionMiddlewareは、現在のセッションを表す、読み書き可能でディクショナリライクなオブジェクトを設定します。
- HttpRequest.site¶
From the
CurrentSiteMiddleware: An instance ofSiteorRequestSiteas returned byget_current_site()representing the current site.
- HttpRequest.user¶
AuthenticationMiddlewareから: 現在ログインしているユーザーを表すAUTH_USER_MODELのインスタンスです。ユーザーが現在ログインしていない場合、userはAnonymousUserのインスタンスに設定されます。is_authenticatedを使用して、それらを区別できます。例えば、こうです:if request.user.is_authenticated: ... # Do something for logged-in users. else: ... # Do something for anonymous users.
auser()メソッドは同じ機能を提供しますが、非同期コンテキストから使用できます。
メソッド¶
- HttpRequest.auser()¶
AuthenticationMiddlewareから: コルーチン。現在ログインしているユーザーを表すAUTH_USER_MODELのインスタンスを返します。もしユーザーが現在ログインしていない場合、auserはAnonymousUserのインスタンスを返します。これはuser属性に似ていますが、非同期コンテキストでも機能します。
- HttpRequest.get_host()[ソース]¶
リクエストの発信元ホストを返します。この情報は、順番に
HTTP_X_FORWARDED_HOST(もしUSE_X_FORWARDED_HOSTが有効な場合) およびHTTP_HOSTヘッダーから取得されます。これらが値を提供しない場合、メソッドはSERVER_NAMEとSERVER_PORTの組み合わせを使用します。詳細は PEP 3333 で説明されています。例:
"127.0.0.1:8000"ホストが
ALLOWED_HOSTSにないか、ドメイン名が RFC 1034/1035 に従っていない場合、django.core.exceptions.DisallowedHostを発生させます。注釈
The
get_host()method fails when the host is behind multiple proxies. One solution is to use middleware to rewrite the proxy headers, as in the following example:class MultipleProxyMiddleware: FORWARDED_FOR_FIELDS = [ "HTTP_X_FORWARDED_FOR", "HTTP_X_FORWARDED_HOST", "HTTP_X_FORWARDED_SERVER", ] def __init__(self, get_response): self.get_response = get_response def __call__(self, request): """ Rewrites the proxy headers so that only the most recent proxy is used. """ for field in self.FORWARDED_FOR_FIELDS: if field in request.META: if "," in request.META[field]: parts = request.META[field].split(",") request.META