リクエストとレスポンスのオブジェクト¶
簡単な概要¶
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.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¶
- CurrentSiteMiddlewareは、現在のサイトを表す- Siteまたは- RequestSiteのインスタンスを、- get_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()¶
- New in Django 5.0.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を発生させます。- 注釈 - get_host()メソッドは、ホストが複数のプロキシの背後にある場合に失敗します。一つの解決策として、以下の例に示すように、プロキシのヘッダーを書き換えるためのミドルウェアを使用できます:- 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[field] = parts[-1].strip() return self.get_response(request) - このミドルウェアは、 - get_host()の値に依存する他のミドルウェアよりも前に配置されるべきです (例えば、- CommonMiddlewareや- CsrfViewMiddlewareなど)。
- HttpRequest.get_port()[ソース]¶
- リクエストの元となったポートを、 - HTTP_X_FORWARDED_PORTと- SERVER_PORTの- META変数から、その順に使用して情報を取得し返します (ただし、- USE_X_FORWARDED_PORTが有効になっている場合)。
- HttpRequest.get_full_path()[ソース]¶
- 必要に応じて、 - pathにクエリ文字列を追加して返します。- 例: - "/music/bands/the_beatles/?print=true"
- HttpRequest.get_full_path_info()[ソース]¶
- get_full_path()と似ていますが、- pathの代わりに- path_infoを使用します。- 例: - "/minfo/music/bands/the_beatles/?print=true"
- HttpRequest.build_absolute_uri(location=None)[ソース]¶
- locationの絶対URI形式を返します。もし location が指定されていない場合、- request.get_full_path()が location に設定されます。- もし場所がすでに絶対 URI である場合、それは変更されません。そうでない場合、このリクエストで利用可能なサーバ変数を使用して絶対 URI が構築されます。例えば: - >>> request.build_absolute_uri() 'https://example.com/music/bands/the_beatles/?print=true' >>> request.build_absolute_uri("/bands/") 'https://example.com/bands/' >>> request.build_absolute_uri("https://example2.com/bands/") 'https://example2.com/bands/' - 注釈 - 同一サイト上でHTTPとHTTPSを混在させることは推奨されません。そのため、 - build_absolute_uri()は常に、現在のリクエストと同じスキームを持つ絶対URIを生成します。ユーザーをHTTPSにリダイレクトする必要がある場合は、WebサーバーにすべてのHTTPトラフィックをHTTPSにリダイレクトさせるのが最善です。
- HttpRequest.get_signed_cookie(key, default=RAISE_ERROR, salt='', max_age=None)[ソース]¶
- 署名付きクッキーの値を返します。署名が無効である場合は - django.core.signing.BadSignature例外が発生します。- default引数を提供した場合、例外は抑制され、代わりにそのデフォルト値が返されます。- オプションの - salt引数は、秘密鍵への総当たり攻撃から保護するために使用できます。指定された場合、- max_age引数は、クッキー値に付加された署名付きタイムスタンプと比較して、クッキーが- max_age秒より古くないことを確認します。- 例: - >>> request.get_signed_cookie("name") 'Tony' >>> request.get_signed_cookie("name", salt="name-salt") 'Tony' # assuming cookie was set using the same salt >>> request.get_signed_cookie("nonexistent-cookie") KeyError: 'nonexistent-cookie' >>> request.get_signed_cookie("nonexistent-cookie", False) False >>> request.get_signed_cookie("cookie-that-was-tampered-with") BadSignature: ... >>> request.get_signed_cookie("name", max_age=60) SignatureExpired: Signature age 1677.3839159 > 60 seconds >>> request.get_signed_cookie("name", False, max_age=60) False - 詳細については、 暗号署名 を参照してください。 
- HttpRequest.accepts(mime_type)[ソース]¶
- リクエストの - Acceptヘッダーが- mime_type引数と一致する場合に- Trueを返します。- >>> request.accepts("text/html") True - ほとんどのブラウザはデフォルトで - Accept: */*を送信するため、これはすべてのコンテンツタイプに対して- Trueを返します。APIリクエストに明示的な- Acceptヘッダーを設定することは、それらの利用者のみに異なるコンテンツタイプを返すために役立ちます。APIの利用者に異なるコンテントを返すための- accepts()の使用例については、 コンテンツネゴシエーションの例 を参照してください。- レスポンスが - Acceptヘッダーの内容によって変わる場合、 Django の- キャッシュミドルウェアなどのキャッシュ形式を使用している場合は、レスポンスが適切にキャッシュされるように、ビューを- vary_on_headers('Accept')でデコレートする必要があります。
- HttpRequest.__iter__()[ソース]¶
- HttpRequestインスタンスから読み取るためのファイルライクなインターフェースを実装するメソッドです。これにより、着信リクエストをストリーミング形式で消費することが可能になります。一般的な使用例は、大きなXMLペイロードをメモリ内で完全なXMLツリーを構築することなく、繰り返しパーサーで処理する場合です。- この標準インターフェースを用いると、 - HttpRequestインスタンスは- ElementTreeのようなXMLパーサーに直接渡すことができます。- import xml.etree.ElementTree as ET for element in ET.iterparse(request): process(element) 
QueryDict オブジェクト¶
HttpRequest オブジェクト内では、GET と POST 属性は django.http.QueryDict のインスタンスです。これは、同一のキーに対する複数の値を扱うためにカスタマイズされた、辞書型に似たクラスです。これが必要なのは、いくつかの HTML (特に <select multiple>) が同一キーで複数の値を渡すからです。
request.POST や request.GET の QueryDictは、通常の request/response 内でアクセスするときには編集不可です。編集可能なものを取得するには、QueryDict.copy() を使う必要があります。
メソッド¶
QueryDict はディクショナリのサブクラスなので、標準的なディクショナリのメソッドを全て実装しています。当てはまらないのはおおむね以下の通りです:
- QueryDict.__init__(query_string=None, mutable=False, encoding=None)[ソース]¶
- QueryDictに基づいて- QueryDictオブジェクトをインスタンス化します。- >>> QueryDict("a=1&a=2&c=3") <QueryDict: {'a': ['1', '2'], 'c': ['3']}> - query_stringが渡されなかった場合は、- QueryDict空となります (何のキーや値も持ちません)。- 使用する - QueryDictのほとんど、特に- request.POSTや- request.GETにおける場合、編集不可となっています。自分でインスタンスを生成する場合は、- __init__()に- mutable=Trueを渡すことで編集可能にできます。- キーとバリューの両方を設定するための文字列は、 - encodingから- strに変換されます。- encodingがセットされていない場合、- DEFAULT_CHARSETがデフォルトとなります。
- classmethod QueryDict.fromkeys(iterable, value='', mutable=False, encoding=None)[ソース]¶
- 新しい - QueryDictを作成します。キーは- iterableで、各値は- valueになります。例えば:- >>> QueryDict.fromkeys(["a", "a", "b"], value="val") <QueryDict: {'a': ['val', 'val'], 'b': ['val']}> 
- QueryDict.__getitem__(key)¶
- 指定したキーに対する値を返します。キーが複数の値を持つ場合、最後の値を返します。キーが存在しない場合は - django.utils.datastructures.MultiValueDictKeyErrorを発生させます (これは Python の標準的な- KeyErrorサブクラスなので、- KeyErrorをキャッチすることに固執できます)。
- QueryDict.__setitem__(key, value)[ソース]¶
- 指定したキーを - [value](各要素が- valueのリスト) にセットします。 副作用を持つ他のディクショナリ関数と同様に、編集可能な- QueryDict(- QueryDict.copy()で作成されたものなど) のみで呼び出し可能です.
- QueryDict.__contains__(key)¶
- 指定したキーがセットされている場合 - Trueを返します。例えば- if "foo" in request.GETを実行するのと同じです。
- QueryDict.get(key, default=None)¶
- __getitem__()と同じロジックを使いますが、キーが存在しない場合のデフォルト値をフックします。
- QueryDict.setdefault(key, default=None)[ソース]¶
- dict.setdefault()に似ていますが、内部では- __setitem__()を使用します。
- QueryDict.update(other_dict)¶
- QueryDictまたは辞書のどちらかを取ります。- dict.update()と似ていますが、現在の辞書の項目を置き換えるのではなく 追加 します。例えば:- >>> q = QueryDict("a=1", mutable=True) >>> q.update({"a": "2"}) >>> q.getlist("a") ['1', '2'] >>> q["a"] # returns the last '2' 
- QueryDict.items()¶
- dict.items()と似ていますが、これは- __getitem__()と同じ最後の値のロジックを使用し、ビューオブジェクトの代わりにイテレータオブジェクトを返します。例えば:- >>> q = QueryDict("a=1&a=2&a=3") >>> list(q.items()) [('a', '3')] 
- QueryDict.values()¶
- dict.values()のように、- __getitem__()と同じ最後の値のロジックを使用しますが、ビューオブジェクトの代わりにイテレータを返します。例えば:- >>> q = QueryDict("a=1&a=2&a=3") >>> list(q.values()) ['3'] 
加えて、QueryDict は以下のメソッドを持ちます:
- QueryDict.copy()[ソース]¶
- copy.deepcopy()を使用してオブジェクトのコピーを返します。このコピーは、元のオブジェクトがイミュータブルであったとしても、ミュータブルです。
- QueryDict.getlist(key, default=None)¶
- リクエストされたキーのデータのリストを返します。キーが存在しない場合には、 - defaultが- Noneであれば空のリストを返します。デフォルト値がリストでない限り、リストを返すことが保証されています。
- QueryDict.setlist(key, list_)[ソース]¶
- 指定されたキーを - list_に設定します (- __setitem__()と異なります)。
- QueryDict.setlistdefault(key, default_list=None)[ソース]¶
- setdefault()に似ていますが、単一の値の代わりに値のリストを取ります。
- QueryDict.lists()¶
- items()に似ていますが、辞書の各メンバーに対して、すべての値をリストとして含んでいます。例えば:- >>> q = QueryDict("a=1&a=2&a=3") >>> q.lists() [('a', ['1', '2', '3'])] 
- QueryDict.pop(key)[ソース]¶
- 指定されたキーに対応する値のリストを返し、それらを辞書から削除します。キーが存在しない場合は - KeyErrorを発生させます。例えば:- >>> q = QueryDict("a=1&a=2&a=3", mutable=True) >>> q.pop("a") ['1', '2', '3'] 
- QueryDict.popitem()[ソース]¶
- 辞書の任意のメンバーを削除し (順序の概念がないため)、キーとキーに対するすべての値のリストを含む2値タプルを返します。空の辞書に対して呼び出されると - KeyErrorを発生させます。例えば:- >>> q = QueryDict("a=1&a=2&a=3", mutable=True) >>> q.popitem() ('a', ['1', '2', '3']) 
- QueryDict.dict()¶
- QueryDictの各(key, list)ペアに対して、- dict形式の表現を返します。- dictは、リストの中の要素の1つである item に対して、(key, item) のペアを持ちます。これは、- QueryDict.__getitem__()と同じロジックを使用します。- >>> q = QueryDict("a=1&a=3&a=5") >>> q.dict() {'a': '5'} 
HttpResponse オブジェクト¶
Django によって自動的に生成される HttpRequest オブジェクトとは対照的に、HttpResponse オブジェクトの作成はあなたの責任です。プログラム内に記述されるあらゆるビューは、HttpResponse をインスタンス化し、データを格納して返す必要があります。
HttpResponse クラスは django.http モジュール内に存在します。
使い方¶
文字列を渡す¶
一般的な使い方としては、ページのコンテンツを文字列、バイト文字列、または memoryview として、 HttpResponse コンストラクタに渡します。
>>> from django.http import HttpResponse
>>> response = HttpResponse("Here's the text of the web page.")
>>> response = HttpResponse("Text only, please.", content_type="text/plain")
>>> response = HttpResponse(b"Bytestrings are also accepted.")
>>> response = HttpResponse(memoryview(b"Memoryview as well."))
しかし、内容を段階的に追加したい場合は、 response をファイルライクオブジェクトとして使用できます:
>>> response = HttpResponse()
>>> response.write("<p>Here's the text of the web page.</p>")
>>> response.write("<p>Here's another paragraph.</p>")
イテレータを渡す¶
最後に、文字列ではなくイテレータを HttpResponse に渡すこともできます。 HttpResponse はイテレータを即座に受け取り、その内容を文字列として保存し、破棄します。ファイルやジェネレータのような close() メソッドを持つオブジェクトは、すぐに閉じられます。
レスポンスに対して、イテレータからクライアントにストリーミングさせる必要がある場合には、代わりに StreamingHttpResponse クラスを使う必要があります。
ヘッダーフィールドをセットする¶
レスポンスでヘッダーフィールドを設定または削除するには、 HttpResponse.headers を使用してください。
>>> response = HttpResponse()
>>> response.headers["Age"] = 120
>>> del response.headers["Age"]
レスポンスを辞書のように扱うことで、ヘッダーを操作することもできます:
>>> response = HttpResponse()
>>> response["Age"] = 120
>>> del response["Age"]
これは HttpResponse.headers へのプロキシで、 HttpResponse が提供する本来のインタフェースです。
このインターフェースを使用する際、辞書とは異なり、ヘッダーフィールドが存在しない場合に del が KeyError を発生させることはありません。
インスタンス化の際にもヘッダーを設定できます:
>>> response = HttpResponse(headers={"Age": 120})
Cache-Control および Vary ヘッダーフィールドを設定するには、これらのフィールドが複数のカンマ区切りの値を持ち得るため、 django.utils.cache から patch_cache_control() と patch_vary_headers() メソッドを使用することが推奨されます。"patch" メソッドは、ミドルウェアによって追加された他の値が削除されないように保証します。
HTTP ヘッダフィールドには改行を含めることはできません。改行文字 (CR または LF) を含むヘッダフィールドを設定しようとすると、BadHeaderError が発生します。
レスポンスをファイル添付物として扱うようにブラウザに指示します。¶
ブラウザにレスポンスをファイル添付として扱うように指示するためには、Content-Type と Content-Disposition ヘッダを設定します。例えば、Microsoft Excel スプレッドシートを返す方法は以下のようになります:
>>> response = HttpResponse(
...     my_data,
...     headers={
...         "Content-Type": "application/vnd.ms-excel",
...         "Content-Disposition": 'attachment; filename="foo.xls"',
...     },
... )
Content-Disposition ヘッダについては Django 固有のものはありませんが、その構文を忘れやすいので、ここに含めています。
属性¶
- HttpResponse.cookies¶
- レスポンスに含まれるクッキーを保持する - http.cookies.SimpleCookieオブジェクトです。
- HttpResponse.headers¶
- 大文字小文字を区別しない辞書型オブジェクトで、 - Set-Cookieヘッダを除くすべてのHTTPヘッダに対するインターフェイスを提供します。 ヘッダーフィールドをセットする および- HttpResponse.cookiesを参照してください。
- HttpResponse.charset¶
- 応答がエンコードされる文字セットを示す文字列です。 - HttpResponseのインスタンス化の際に指定されなかった場合、- content_typeから抽出され、もしこれが失敗した場合は、- DEFAULT_CHARSET設定が使用されます。
- HttpResponse.status_code¶
- レスポンスの HTTP ステータスコード 。 - reason_phraseが明示的にセットされていない限り、コンストラクタの外で- status_codeの値を変更すると- reason_phraseの値も変更されます。
- HttpResponse.reason_phrase¶
- レスポンスの HTTP reason フレーズです。これは HTTP 標準の デフォルトの reason フレーズを使用します。 - reason_phraseが明示的に設定されていない場合、- status_codeの値に基づいて決定されます。
- HttpResponse.streaming¶
- これは常に - Falseです。- この属性は、ミドルウェアが通常のレスポンスとは違う形でストリーミングレスポンスを扱えるようにするために存在しています。 
- HttpResponse.closed¶
- レスポンスが閉じられた場合、 - Trueとなります。
メソッド¶
- HttpResponse.__init__(content=b'', content_type=None, status=200, reason=None, charset=None, headers=None)[ソース]¶
- 指定されたページ内容、コンテンツタイプ、およびヘッダーを持つ - HttpResponseオブジェクトをインスタンス化します。- contentは、最も一般的にはイテレータ、バイト文字列、- memoryview、または文字列です。その他の型は、文字列表現をエンコードしてバイト文字列に変換されます。イテレータは文字列またはバイト文字列を返すべきで、それらはレスポンスの内容を形成するために連結されます。- content_typeは、MIME タイプであり、オプションで文字セットエンコーディングを指定して HTTP- Content-Typeヘッダを埋めるために使用されます。指定されていない場合、デフォルトでは- 'text/html'と- DEFAULT_CHARSET設定によって形成されます: つまり- "text/html; charset=utf-8"。- statusはレスポンスの HTTPステータスコード です。Python の- http.HTTPStatusを使用して、- HTTPStatus.NO_CONTENTのような意味のあるエイリアスを使用できます。- reasonは HTTP レスポンスフレーズです。指定しない場合、デフォルトのフレーズが使用されます。- charsetは、レスポンスがエンコードされる文字セットです。もし指定されていない場合、- content_typeから抽出されます。それが失敗した場合は、- DEFAULT_CHARSET設定が使用されます。- headersはレスポンス用のHTTPヘッダーの- dictです。
- HttpResponse.__setitem__(header, value)¶
- 指定されたヘッダ名に指定された値を設定します。 - headerと- valueは共に文字列であるべきです。
- HttpResponse.__delitem__(header)¶
- 指定された名前のヘッダーを削除します。ヘッダーが存在しなくても、静かに失敗します。大文字小文字を区別しません。 
- HttpResponse.__getitem__(header)¶
- 指定されたヘッダ名の値を返します。大文字小文字を区別しません。 
- HttpResponse.get(header, alternate=None)¶
- 指定されたヘッダーの値を返します。ヘッダーが存在しない場合は、 - alternateを返します。
- HttpResponse.has_header(header)¶
- 指定された名前のヘッダーが存在するかどうかを大文字小文字を区別せずにチェックし、 - Trueまたは- Falseを返します。
- HttpResponse.items()¶
- レスポンスのHTTPヘッダに対して、 - dict.items()のように動作します。
- HttpResponse.setdefault(header, value)¶
- ヘッダーがまだ設定されていない場合に、ヘッダーを設定します。 
- HttpResponse.set_cookie(key, value='', max_age=None, expires=None, path='/', domain=None, secure=False, httponly=False, samesite=None)¶
- クッキーを設定します。パラメータは、Python標準ライブラリ内の - Morselクッキーオブジェクトと同じです。- max_ageは- timedeltaオブジェクト、整数秒数、または- None(デフォルト) である必要があります。これにより、クッキーの有効期限はクライアントのブラウザセッションが終了するまでとなります。- expiresが指定されていない場合は自動的に計算されます。
- expiresは、- "Wdy, DD-Mon-YY HH:MM:SS GMT"形式の文字列か、UTCの- datetime.datetimeオブジェクトであるべきです。もし- expiresが- datetimeオブジェクトである場合、- max_ageが計算されます。
- クロスドメインのクッキーを設定したい場合は、 - domainを使用してください。例えば、- domain="example.com"とすると、www.example.com、blog.example.com などのドメインから読み取れるクッキーが設定されます。そうでない場合、クッキーは設定したドメインのみから読み取れます。
- secure=Trueを使用すると、リクエストが- httpsスキームで行われた場合にのみ、クッキーがサーバーに送信されるようになります。
- クライアントサイドのJavaScriptがクッキーにアクセスするのを防ぎたい場合は、 - httponly=Trueを使用してください。- HttpOnly は、Set-Cookie HTTP レスポンスヘッダーに含まれるフラグです。これは、クッキーの RFC 6265 標準の一部であり、クライアントサイドのスクリプトが保護されたクッキーデータにアクセスするリスクを軽減する有用な方法です。 
- samesite='Strict'や- samesite='Lax'を使用して、ブラウザにクロスオリジンリクエストを行う際にこのクッキーを送信しないよう指示します。 SameSite はすべてのブラウザに対応しているわけではないため、DjangoのCSRF保護の代わりとなるものではありませんが、防御の深度を増すための措置です。- samesite='None'(文字列) を使えば、このクッキーが同一サイトおよびクロスサイトのすべてのリクエストに送信されることを明示できます。
 - 警告 - RFC 6265 には、ユーザーエージェントが少なくとも 4096 バイトのクッキーをサポートすべきであると記されています。多くのブラウザでは、これが最大サイズでもあります。Django は 4096 バイトを超えるクッキーを保存しようとした際に例外を発生させませんが、多くのブラウザでは正しくクッキーを設定しないでしょう。 
- HttpResponse.set_signed_cookie(key, value, salt='', max_age=None, expires=None, path='/', domain=None, secure=False, httponly=False, samesite=None)¶
- set_cookie()のように、クッキーを設定する前に 暗号署名 を行います。- HttpRequest.get_signed_cookie()と組み合わせて使用してください。オプショナルな- salt引数を使用して鍵強度を高めることができますが、対応する- HttpRequest.get_signed_cookie()呼び出しにそれを渡す必要があります。
- HttpResponse.delete_cookie(key, path='/', domain=None, samesite=None)¶
- 指定されたキーを持つクッキーを削除します。キーが存在しない場合は、静かに失敗します。 - クッキーの動作方法により、 - pathと- domainは- set_cookie()で使用した値と同じでなければなりません。そうでない場合、クッキーが削除されない可能性があります。
- HttpResponse.close()¶
- このメソッドは、リクエストの終了時に、WSGIサーバーによって直接呼び出されます。 
- HttpResponse.write(content)[ソース]¶
- このメソッドは、 - HttpResponseインスタンスをファイルライクオブジェクトにします。
- HttpResponse.flush()¶
- このメソッドは、 - HttpResponseインスタンスをファイルライクオブジェクトにします。
- HttpResponse.tell()[ソース]¶
- このメソッドは、 - HttpResponseインスタンスをファイルライクオブジェクトにします。
- HttpResponse.getvalue()[ソース]¶
- HttpResponse.contentの値を返します。このメソッドにより、- HttpResponseインスタンスはストリームライクオブジェクトになります。
- HttpResponse.readable()¶
- 常に - Falseです。このメソッドは- HttpResponseインスタンスをストリームライクオブジェクトにします。
- HttpResponse.seekable()¶
- 常に - Falseです。このメソッドは- HttpResponseインスタンスをストリームライクオブジェクトにします。
- HttpResponse.writable()[ソース]¶
- 常に - Trueです。このメソッドは- HttpResponseインスタンスをストリームライクオブジェクトにします。
- HttpResponse.writelines(lines)[ソース]¶
- レスポンスに行のリストを書き込みます。行区切りは追加されません。このメソッドは、 - HttpResponseインスタンスをストリームライクオブジェクトにします。
HttpResponse サブクラス¶
Djangoには、異なるタイプのHTTPレスポンスを処理するための HttpResponse のサブクラスがいくつか含まれています。 HttpResponse と同様に、これらのサブクラスは django.http に存在します。
- class HttpResponseRedirect[ソース]¶
- コンストラクタには最初の引数が必須です。これはリダイレクト先のパスです。これは完全なURL (例: - 'https://www.yahoo.com/search/')、ドメインなしの絶対パス (例:- '/search/')、あるいは相対パス (例:- 'search/') でも構いません。後者の場合、クライアントブラウザが現在のパスに従って完全なURLを自身で再構築します。その他のオプションのコンストラクタ引数については、- HttpResponseを参照してください。この処理はHTTPステータスコード302を返すことに注意してください。- url¶
- この読み取り専用の属性は、レスポンスがリダイレクトするURLを表しています ( - Locationレスポンスヘッダに相当します)。
 
- class HttpResponsePermanentRedirect[ソース]¶
- HttpResponseRedirectに似ていますが、"found" リダイレクト(ステータスコード 302) ではなく、恒久的なリダイレクト(HTTPステータスコード 301) を返します。
- class HttpResponseNotModified[ソース]¶
- コンストラクタは引数を取らず、このレスポンスにはコンテンツを追加すべきではありません。これを使用して、ページがユーザーの最後のリクエスト以降に変更されていないことを指定します(ステータスコード304)。 
- class HttpResponseBadRequest[ソース]¶
- HttpResponseと似ていますが、ステータスコードとして 400 を使用します。
- class HttpResponseNotFound[ソース]¶
- HttpResponseと似ていますが、404 ステータスコードを使用します。
- class HttpResponseForbidden[ソース]¶
- HttpResponseと似ていますが、403 ステータスコードを使用します。
- class HttpResponseNotAllowed[ソース]¶
- HttpResponseと似ていますが、ステータスコード 405 を使用します。コンストラクタへの最初の引数は必須です: 許可されているメソッドのリスト (例:- ['GET', 'POST'])。
- class HttpResponseGone[ソース]¶
- HttpResponseと似ていますが、410 ステータスコードを使用します。
- class HttpResponseServerError[ソース]¶
- HttpResponseと似ていますが、ステータスコードとして 500 を使用します。
注釈
HttpResponse のカスタムサブクラスが render メソッドを実装している場合、Djangoはそれを SimpleTemplateResponse を模倣しているものとして扱い、 render メソッド自体が有効なレスポンスオブジェクトを返さなければなりません。
カスタムレスポンスクラス¶
Django が提供していないレスポンスクラスが必要になった場合は、http.HTTPStatus を使用して作成できます。例えば:
from http import HTTPStatus
from django.http import HttpResponse
class HttpResponseNoContent(HttpResponse):
    status_code = HTTPStatus.NO_CONTENT
JsonResponse オブジェクト¶
- class JsonResponse(data, encoder=DjangoJSONEncoder, safe=True, json_dumps_params=None, **kwargs)[ソース]¶
- HttpResponseのサブクラスで、JSONエンコードされたレスポンスを作成するのに役立ちます。このクラスは、いくつかの違いを除き、その基底クラスからほとんどの動作を継承しています:- デフォルトの - Content-Typeヘッダーは application/json に設定されています。- 最初のパラメーター - dataは、- dictインスタンスであるべきです。- safeパラメーターが- Falseに設定されている場合 (下記参照)、これはどんな JSON シリアライズ可能オブジェクトでも可能です。- encoderのデフォルトは- django.core.serializers.json.DjangoJSONEncoderで、このエンコーダーがデータのシリアライズに使用されます。このシリアライザについての詳細は、JSON のシリアライズ を参照してください。- safeブールパラメータのデフォルト値は- Trueです。もし- Falseに設定されている場合、任意のオブジェクトをシリアライズのために渡すことができます(そうでなければ、- dictインスタンスのみが許可されます)。- safeが- Trueであり、非- dictオブジェクトが第一引数として渡された場合、- TypeErrorが発生します。- json_dumps_paramsパラメーターは、レスポンス生成に使用される- json.dumps()呼び出しに渡すキーワード引数の辞書です。
使い方¶
一般的な使用方法は以下のようになります:
>>> from django.http import JsonResponse
>>> response = JsonResponse({"foo": "bar"})
>>> response.content
b'{"foo": "bar"}'
辞書以外のオブジェクトのシリアライズ¶
dict 以外のオブジェクトをシリアライズする場合、 safe パラメータを False に設定する必要があります:
>>> response = JsonResponse([1, 2, 3], safe=False)
safe=False を指定しなかった場合、TypeError が発生します。
dict オブジェクトに基づいた API は、より拡張性が高く、柔軟性があり、前方互換性の維持が容易になります。したがって、JSON エンコードされたレスポンスでは非 dict オブジェクトの使用は避けるべきです。
警告
ECMAScript 5th edition の前では、JavaScript の Array コンストラクタに対する侵害が可能でした。この理由から、Django はデフォルトで JsonResponse コンストラクタに辞書以外のオブジェクトを渡すことを許可しません。ただし、ほとんどの最新ブラウザは ECMAScript 5 を実装しており、この攻撃ベクトルが取り除かれています。したがって、このセキュリティ対策を無効にすることが可能です。
デフォルトのJSONエンコーダーを変更する¶
異なるJSONエンコーダークラスを使用する必要がある場合は、コンストラクターメソッドに encoder パラメータを渡すことができます。
>>> response = JsonResponse(data, encoder=MyJSONEncoder)
StreamingHttpResponse オブジェクト¶
StreamingHttpResponse クラスは、Djangoからブラウザへのレスポンスをストリーミングするために使用されます。
高度な使用法
StreamingHttpResponse はやや高度です。アプリケーションを WSGI で同期的に、あるいは ASGI で非同期的に提供するかを知り、使用方法を適切に調整することが重要です。
これらの注意点を注意深く読んでください。
WSGI 下での StreamingHttpResponse の使用例としては、レスポンスの生成に時間がかかりすぎる場合やメモリを大量に使用する場合にコンテンツをストリーミングすることが挙げられます。例えば、大きなCSVファイルを生成する場合 に役立ちます。
しかしながら、これを行う際にはパフォーマンスを考慮する必要があります。WSGIの下でのDjangoは、短期間のリクエストのために設計されています。ストリーミングレスポンスは、レスポンスの全期間にわたってワーカープロセスを占有します。これにより、パフォーマンスが低下する可能性があります。
一般的に、ストリーミングレスポンスに頼るのではなく、リクエスト/レスポンスサイクルの外で高コストのタスクを行うほうが良いです。
しかし、ASGI の下で提供される場合、StreamingHttpResponse はI/Oを待っている間に他のリクエストが提供されるのを妨げる必要はありません。これにより、ストリーミングコンテンツのための長時間生存するリクエストや、ロングポーリングやサーバー送信イベントといったパターンの実装の可能性が開かれます。
ASGI環境下であっても、StreamingHttpResponse は、クライアントにデータを転送する前に全内容がイテレートされることが絶対に必要な状況でのみ使用すべきです。コンテンツにアクセスできないため、多くのミドルウェアが正常に機能しません。例えば、ストリーミングレスポンスには ETag や Content-Length ヘッダを生成することができません。
StreamingHttpResponse は、若干異なるAPIを特徴とするため、HttpResponse のサブクラスではありません。しかし、以下に挙げる顕著な違いを除いて、ほぼ同一です。
- コンテンツとしてバイト文字列、 - memoryview、または文字列を生成するイテレータを渡すべきです。WSGI下で提供する場合、これは同期イテレータであるべきです。ASGI下で提供する場合、これは非同期イテレータであるべきです。
- その内容にアクセスするには、レスポンスオブジェクト自体をイテレートする必要があります。これはクライアントにレスポンスが返されたときのみ発生すべきです。自分でレスポンスをイテレートすべきではありません。 - WSGIでは、レスポンスは同期的にイテレートされます。ASGIでは、レスポンスは非同期的にイテレートされます。(これが、イテレータのタイプが使用しているプロトコルと一致しなければならない理由です。) - クラッシュを回避するため、間違ったイテレータのタイプは、イテレート中に正しいタイプにマッピングされ、警告が発生します。ただし、これを行うにはイテレータを完全に消費する必要があり、これは全く - StreamingHttpResponseを使用する目的を果たしません。
- これは - content属性を持ちません。代わりに- streaming_content属性があります。これはミドルウェアでレスポンスのイテラブルをラップするために使用できますが、消費されるべきではありません。
- ファイルライクオブジェクトの - tell()や- write()メソッドは使用できません。これらを使用すると例外が発生します。
HttpResponse と StreamingHttpResponse は、共通の基底クラス HttpResponseBase を持っています。
属性¶
- StreamingHttpResponse.streaming_content[ソース]¶
- レスポンス内容のイテレータ。 バイト文字列は - HttpResponse.charsetに従ってエンコードされます。
- StreamingHttpResponse.status_code¶
- レスポンスの HTTP ステータスコード 。 - reason_phraseが明示的にセットされていない限り、コンストラクタの外で- status_codeの値を変更すると- reason_phraseの値も変更されます。
- StreamingHttpResponse.reason_phrase¶
- レスポンスの HTTP reason フレーズです。これは HTTP 標準の デフォルトの reason フレーズを使用します。 - reason_phraseが明示的に設定されていない場合、- status_codeの値に基づいて決定されます。
- StreamingHttpResponse.streaming¶
- これは常に - Trueです。
- StreamingHttpResponse.is_async¶
- StreamingHttpResponse.streaming_contentが非同期イテレータであるかどうかを示す真偽値です。- これは、 - StreamingHttpResponse.streaming_contentをラップする必要があるミドルウェアにとって便利です。
切断の取り扱い¶
クライアントがストリーミングレスポンス中に切断されると、Django はレスポンスを処理しているコルーチンをキャンセルします。リソースの手動クリーンアップを行いたい場合は、asyncio.CancelledError をキャッチして行うことができます:
async def streaming_response():
    try:
        # Do some work here
        async for chunk in my_streaming_iterator():
            yield chunk
    except asyncio.CancelledError:
        # Handle disconnect
        ...
        raise
async def my_streaming_view(request):
    return StreamingHttpResponse(streaming_response())
この例は、レスポンスがストリーミングされている間にクライアントの切断をどのように処理するかを示しているだけです。ビュー内で StreamingHttpResponse オブジェクトを返す前に長時間実行される操作を行う場合は、ビュー自体で 切断を処理する 必要があるかもしれません。
FileResponse オブジェクト¶
- class FileResponse(open_file, as_attachment=False, filename='', **kwargs)[ソース]¶
- FileResponseはバイナリファイルに最適化された- StreamingHttpResponseのサブクラスです。もし WSGI サーバーが提供していれば wsgi.file_wrapper を使用し、そうでない場合はファイルを小さなチャンクでストリーミングします。- as_attachment=Trueだと、- Content-Dispositionヘッダーが- attachmentに設定され、ブラウザにファイルをダウンロードするように要求します。それ以外の場合は、ファイル名が利用可能な場合のみ、値が- inline(ブラウザのデフォルト値)の- Content-Dispositionヘッダーが設定されます。- もし - open_fileに名前がない、または- open_fileの名前が適切でない場合は、- filenameパラメータを使用してカスタムファイル名を提供してください。- io.BytesIOのようなファイルライクオブジェクトを渡す場合、それを- FileResponseに渡す前に- seek()を行うのはあなたの仕事です。- open_fileの内容から推測できる場合、- Content-Lengthヘッダーは自動的に設定されます。- Content-Typeヘッダーは、- filenameや- open_fileの名前から推測できる場合には自動的に設定されます。
FileResponse は、例えば以下のようにバイナリモードで開かれたファイルのような、バイナリー内容を持つあらゆるファイルライクオブジェクトを受け付けます。
>>> from django.http import FileResponse
>>> response = FileResponse(open("myfile.png", "rb"))
ファイルは自動的に閉じられるため、コンテキストマネージャーで開かないでください。
ASGI における使用
PythonのファイルAPIは同期的です。これは、ファイルをASGI下で提供するためには、ファイルを完全に消費しなければならないことを意味します。
非同期にファイルをストリーミングするには、aiofiles のような非同期ファイルAPIを提供するサードパーティパッケージを使用する必要があります。
メソッド¶
HttpResponseBase クラス¶
HttpResponseBase クラスは、Django のすべてのレスポンスに共通です。直接レスポンスを作成するために使用すべきではありませんが、型チェックの際に役立つことがあります。
 
          