リクエストとレスポンスのオブジェクトLink to this heading
簡単な概要Link to this heading
Django は、システムを通じてステータスを渡すために、リクエストとレスポンスのオブジェクトを使います。
あるページがリクエストされたとき、Django はリクエストに関するメタデータを含んだ HttpRequest オブジェクトを生成します。それから Django は HttpRequest をビュー関数の最初の関数として渡し、適切なビューを読み込みます。あらゆるビューは HttpResponse オブジェクトを返す必要があります。
このドキュメントでは、HttpRequest と HttpResponse オブジェクトの API を説明しています。これは django.http モジュールにて定義されています。
HttpRequest オブジェクトLink to this heading
- class HttpRequestLink to this definition
属性Link to this heading
特に記載がない限り、全ての属性は読み取り専用だと考えてください。
- HttpRequest.schemeLink to this definition
リクエストのスキームを表す文字列です (通常は
httpかhttps)。
- HttpRequest.bodyLink to this definition
生の HTTP リクエストボディをバイト文字列として。これは、従来の HTML フォームとは異なる方法でデータを処理するのに便利です:バイナリイメージ、XML ペイロードなど。従来のフォームデータを処理する場合は、
HttpRequest.POSTを使用してください。HttpRequest.read()やHttpRequest.readline()を用いて、ファイルのようなインタフェースからHttpRequestを読み取ることもできます。これらの I/O ストリームメソッドを用いてリクエストを読み取った 後にbody属性にアクセスすると、RawPostDataExceptionが発生します。
- HttpRequest.pathLink to this definition
要求されたページへのフルパスを表す文字列であり、scheme、ドメイン、クエリ文字列は含みません。
例:
"/music/bands/the_beatles/"
- HttpRequest.path_infoLink to this definition
一部のWebサーバー構成では、ホスト名の後のURLがスクリプトプレフィックス部分とパス情報部分に分割されます。
path_info属性は、使用されるWebサーバーに関わらず常にパス情報部分を含んでいます。これをpathの代わりに使用することで、テストサーバーとデプロイメントサーバー間でコードを移動させやすくなります。たとえば、アプリケーションの
WSGIScriptAliasが"/minfo"に設定されている場合、pathが"/minfo/music/bands/the_beatles/"である一方、path_infoは"/music/bands/the_beatles/"となる可能性があります。
- HttpRequest.methodLink to this definition
リクエストで使用された HTTP メソッドを表す文字列です。この値は常に大文字となることが保証されています。たとえば、次のようになります。
if request.method == "GET": do_something() elif request.method == "POST": do_something_else()
- HttpRequest.encodingLink to this definition
フォーム提出データをデコードする際に使用されている現在のエンコーディングを表す文字列(または
Noneで、これはDEFAULT_CHARSET設定が使用されることを意味します)。この属性に書き込むことで、フォームデータにアクセスする際に使用されるエンコーディングを変更できます。その後の属性アクセス(GETやPOSTからの読み取りなど)は、新しいencoding値を使用します。フォームデータがDEFAULT_CHARSETエンコーディングでないことがわかっている場合に便利です。
- HttpRequest.content_typeLink to this definition
リクエストの MIME タイプを表す文字列です。
CONTENT_TYPEから識別されます。
- HttpRequest.content_paramsLink to this definition
CONTENT_TYPEヘッダに含まれる、キーと値のパラーメータのディクショナリです。
- HttpRequest.GETLink to this definition
渡された HTTP GET パラメータを含む、ディクショナリライクのオブジェクトです。後述の
QueryDictのドキュメントを参照してください。
- HttpRequest.POSTLink to this definition
リクエストにフォームデータが含まれている場合に、すべての与えられた HTTP POST パラメータを含む辞書のようなオブジェクト。以下の
QueryDictドキュメントを参照してください。リクエストにポストされた生のデータや非フォームデータにアクセスする必要がある場合は、代わりにHttpRequest.body属性を通じてアクセスしてください。POST メソッドでフォームデータが含まれていない場合に、空の
POSTディクショナリを備えたリクエストが発生する可能性があります。そのため、POST メソッドの使用を確認するためにif request.POSTを使用すべきではありません。代わりに、if request.method == "POST"を使用してください (HttpRequest.methodを参照)。POSTには file-upload の情報が含まれ ません 。詳しくはFILESを参照してください。
- HttpRequest.COOKIESLink to this definition
すべてのクッキーが格納されたディクショナリです。キーと値は文字列です。
- HttpRequest.FILESLink to this definition
FILESは、アップロードされた全てのファイルを含む辞書型のオブジェクトです。FILESの各キーは<input type="file" name="">のnameから成ります。FILESの各値はUploadedFileです。詳細については、ファイルの管理 を参照してください。
FILESには、リクエストメソッドが POST で、リクエストに投稿した<form>にenctype="multipart/form-data"が設定されていた場合にのみデータが含まれます。それ以外の場合、FILESは空の辞書のようなオブジェクトになります。
- HttpRequest.METALink to this definition
利用できるすべての 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.headersLink to this definition
リクエストから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_matchLink to this definition
解決されたURLを表す
ResolverMatchのインスタンスです。この属性は、URLの解決が行われた後にのみ設定されます。つまり、全てのビューで利用可能ですが、URLの解決が行われる前に実行されるミドルウェアでは利用できません (process_view()では使用できます)。
アプリケーションコードがセットする属性Link to this heading
Django はこれらの属性を自分で設定することはありませんが、アプリケーション側で設定された場合にはその値を利用します。
- HttpRequest.current_appLink to this definition
The
urltemplate tag will use its value as thecurrent_appargument toreverse().
- HttpRequest.urlconfLink to this definition
この値は、現在のリクエストに対する root URLconf として使用され、設定の
ROOT_URLCONFを上書きします。詳しくは Django のリクエスト処理 を参照してください。urlconfはNoneに設定することで、それまでにミドルウェアで行われた変更を取り消し、元のROOT_URLCONFを使用するようにできます。
- HttpRequest.exception_reporter_filterLink to this definition
これは、現在のリクエストに対して
DEFAULT_EXCEPTION_REPORTER_FILTERの代わりに使用されます。詳細については、 カスタムエラーレポート を参照してください。
- HttpRequest.exception_reporter_classLink to this definition
これは、現在のリクエストに対して
DEFAULT_EXCEPTION_REPORTERの代わりに使用されます。詳細については カスタムエラーレポート を参照してください。
ミドルウェアが設定する属性Link to this heading
Django の contrib アプリなどのミドルウェアの一部は、リクエストに属性を設定します。もし、リクエストに属性が設定されていない場合は、MIDDLEWARE リスト中に適切なミドルウェアが含まれているかを確認してください。
- HttpRequest.sessionLink to this definition
SessionMiddlewareは、現在のセッションを表す、読み書き可能でディクショナリライクなオブジェクトを設定します。
- HttpRequest.siteLink to this definition
From the
CurrentSiteMiddleware: An instance ofSiteorRequestSiteas returned byget_current_site()representing the current site.
- HttpRequest.userLink to this definition
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()メソッドは同じ機能を提供しますが、非同期コンテキストから使用できます。
メソッドLink to this heading
- HttpRequest.auser()Link to this definition
AuthenticationMiddlewareから: コルーチン。現在ログインしているユーザーを表すAUTH_USER_MODELのインスタンスを返します。もしユーザーが現在ログインしていない場合、auserはAnonymousUserのインスタンスを返します。これはuser属性に似ていますが、非同期コンテキストでも機能します。
- HttpRequest.get_host()Link to this definition
リクエストの発信元ホストを返します。この情報は、順番に
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を発生させます。
- HttpRequest.get_port()Link to this definition
リクエストの元となったポートを、
HTTP_X_FORWARDED_PORTとSERVER_PORTのMETA変数から、その順に使用して情報を取得し返します (ただし、USE_X_FORWARDED_PORTが有効になっている場合)。
- HttpRequest.get_full_path()Link to this definition
必要に応じて、
pathにクエリ文字列を追加して返します。例:
"/minfo/music/bands/the_beatles/?print=true"
- HttpRequest.get_full_path_info()Link to this definition
get_full_path()と似ていますが、pathの代わりにpath_infoを使用します。例:
"/music/bands/the_beatles/?print=true"
- HttpRequest.build_absolute_uri(location=None)Link to this definition
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/'
- HttpRequest.get_signed_cookie(key, default=RAISE_ERROR, salt='', max_age=None)Link to this definition
署名付きクッキーの値を返します。署名が無効である場合は
django.core.signing.BadSignature例外が発生します。default引数を提供した場合、例外は抑制され、代わりにそのデフォルト値が返されます。The optional
saltargument can be used to put the cookie into a separate signature namespace. If supplied, themax_ageargument will be checked against the signed timestamp attached to the cookie value to ensure the cookie is not older thanmax_ageseconds.Cookies signed by older Django versions are accepted by default for backwards compatibility. Set
SIGNED_COOKIE_LEGACY_SALT_FALLBACKtoFalseto reject them.例:
>>> 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.is_secure()Link to this definition
リクエストがセキュアである場合、つまりHTTPSで行われた場合に
Trueを返します。
- HttpRequest.get_preferred_type(media_types)Link to this definition
-
Acceptヘッダーに基づいて、media_typesの中から優先される MIME タイプを返します。クライアントが指定されたいずれのタイプも受け入れない場合はNoneを返します。クライアントが
Acceptヘッダーとしてtext/html,application/json;q=0.8を送信したと仮定します。>>> request.get_preferred_type(["text/html", "application/json"]) "text/html" >>> request.get_preferred_type(["application/json", "text/plain"]) "application/json" >>> request.get_preferred_type(["application/xml", "text/plain"]) NoneMIME タイプにパラメーターが含まれている場合、それらも優先されるメディアタイプを判断する際に考慮されます。たとえば、
Acceptヘッダーがtext/vcard;version=3.0,text/html;q=0.5の場合、request.get_preferred_type()の返り値は、利用可能なメディアタイプによって異なります:>>> request.get_preferred_type( ... [ ... "text/vcard; version=4.0", ... "text/vcard; version=3.0", ... "text/vcard", ... "text/directory", ... ] ... ) "text/vcard; version=3.0" >>> request.get_preferred_type( ... [ ... "text/vcard; version=4.0", ... "text/html", ... ] ... ) "text/html" >>> request.get_preferred_type( ... [ ... "text/vcard; version=4.0", ... "text/vcard", ... "text/directory", ... ] ... ) None(コンテンツネゴシエーションの詳細な仕組みについては、 RFC 9110 Section 12.5.1 を参照してください。)
ほとんどのブラウザはデフォルトで
Accept: */*を送信するため、特に優先順位が指定されません。その場合、media_typesの最初の項目が返されます。API リクエストで明示的に
Acceptヘッダーを設定すると、そのクライアントに対してのみ異なるコンテンツタイプを返すのに役立ちます。Acceptヘッダーに基づいて異なるコンテンツを返す例については コンテンツネゴシエーションの例 を参照してください。
- HttpRequest.accepts(mime_type)Link to this definition
リクエストの
Acceptヘッダがmime_type引数と一致する場合にTrueを返します。>>> request.accepts("text/html") True大半のブラウザは
Accept: */*をデフォルトで送信するので、すべてのコンテンツタイプに対してTrueを返します。accepts()を用いてAcceptヘッダーに基づき異なるコンテンツを返す例については、 コンテンツネゴシエーションの例 を参照してください。
- HttpRequest.read(size=None)Link to this definition
- HttpRequest.readline()Link to this definition
- HttpRequest.readlines()Link to this definition
- HttpRequest.__iter__()Link to this definition
HttpRequestインスタンスから読み取るためのファイルライクなインターフェースを実装するメソッドです。これにより、着信リクエストをストリーミング形式で消費することが可能になります。一般的な使用例は、大きなXMLペイロードをメモリ内で完全なXMLツリーを構築することなく、繰り返しパーサーで処理する場合です。この標準インターフェースを用いると、
HttpRequestインスタンスはElementTreeのようなXMLパーサーに直接渡すことができます。import xml.etree.ElementTree as ET for element in ET.iterparse(request): process(element)
QueryDict オブジェクトLink to this heading
- class QueryDictLink to this definition
HttpRequest オブジェクト内では、GET と POST 属性は django.http.QueryDict のインスタンスです。これは、同一のキーに対する複数の値を扱うためにカスタマイズされた、辞書型に似たクラスです。これが必要なのは、いくつかの HTML (特に <select multiple>) が同一キーで複数の値を渡すからです。
request.POST や request.GET の QueryDictは、通常の request/response 内でアクセスするときには編集不可です。編集可能なものを取得するには、QueryDict.copy() を使う必要があります。
メソッドLink to this heading
QueryDict はディクショナリのサブクラスなので、標準的なディクショナリのメソッドを全て実装しています。当てはまらないのはおおむね以下の通りです:
- QueryDict.__init__(query_string=None, mutable=False, encoding=None)Link to this definition
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)Link to this definition
新しい
QueryDictを作成します。キーはiterableで、各値はvalueになります。例えば:>>> QueryDict.fromkeys(["a", "a", "b"], value="val") <QueryDict: {'a': ['val', 'val'], 'b': ['val']}>
- QueryDict.__getitem__(key)Link to this definition
指定されたキーに対する最後の値を返します。キーは存在するが値がない場合は空リスト(
[])を返します。キーが存在しない場合はdjango.utils.datastructures.MultiValueDictKeyErrorを送出します。(これは Python 標準のKeyErrorのサブクラスなので、単にKeyErrorを捕捉しても構いません。)>>> q = QueryDict("a=1&a=2&a=3", mutable=True) >>> q.__getitem__("a") '3' >>> q.__setitem__("b", []) >>> q.__getitem__("b") []
- QueryDict.__setitem__(key, value)Link to this definition
指定したキーを
[value](各要素がvalueのリスト) にセットします。 副作用を持つ他のディクショナリ関数と同様に、編集可能なQueryDict(QueryDict.copy()で作成されたものなど) のみで呼び出し可能です.
- QueryDict.__contains__(key)Link to this definition
指定したキーがセットされている場合
Trueを返します。例えばif "foo" in request.GETを実行するのと同じです。
- QueryDict.get(key, default=None)Link to this definition
__getitem__()と同じロジックを使いますが、キーが存在しない場合のデフォルト値をフックします。
- QueryDict.setdefault(key, default=None)Link to this definition
dict.setdefault()に似ていますが、内部では__setitem__()を使用します。
- QueryDict.update(other_dict)Link to this definition
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()Link to this definition
dict.items()と似ていますが、これは__getitem__()と同じ最後の値のロジックを使用し、ビューオブジェクトの代わりにイテレータオブジェクトを返します。例えば:>>> q = QueryDict("a=1&a=2&a=3") >>> list(q.items()) [('a', '3')]
- QueryDict.values()Link to this definition
dict.values()のように、__getitem__()と同じ最後の値のロジックを使用しますが、ビューオブジェクトの代わりにイテレータを返します。例えば:>>> q = QueryDict("a=1&a=2&a=3") >>> list(q.values()) ['3']
加えて、QueryDict は以下のメソッドを持ちます:
- QueryDict.copy()Link to this definition
copy.deepcopy()を使用してオブジェクトのコピーを返します。このコピーは、元のオブジェクトがイミュータブルであったとしても、ミュータブルです。
- QueryDict.getlist(key, default=None)Link to this definition
リクエストされたキーのデータのリストを返します。キーが存在しない場合には、
defaultがNoneであれば空のリストを返します。デフォルト値がリストでない限り、リストを返すことが保証されています。
- QueryDict.setlist(key, list_)Link to this definition
指定されたキーを
list_に設定します (__setitem__()と異なります)。
- QueryDict.appendlist(key, item)Link to this definition
key に関連付けられた内部リストに項目を追加します。
- QueryDict.setlistdefault(key, default_list=None)Link to this definition
setdefault()に似ていますが、単一の値の代わりに値のリストを取ります。
- QueryDict.lists()Link to this definition
Like
items(), except it includes all values, as a list, for each member of the dictionary. For example:>>> q = QueryDict("a=1&a=2&a=3") >>> q.lists() [('a', ['1', '2', '3'])]
- QueryDict.pop(key)Link to this definition
指定されたキーに対応する値のリストを返し、それらを辞書から削除します。キーが存在しない場合は
KeyErrorを発生させます。例えば:>>> q = QueryDict("a=1&a=2&a=3", mutable=True) >>> q.pop("a") ['1', '2', '3']
- QueryDict.popitem()Link to this definition
辞書の任意のメンバーを削除し (順序の概念がないため)、キーとキーに対するすべての値のリストを含む2値タプルを返します。空の辞書に対して呼び出されると
KeyErrorを発生させます。例えば:>>> q = QueryDict("a=1&a=2&a=3", mutable=True) >>> q.popitem() ('a', ['1', '2', '3'])
- QueryDict.dict()Link to this definition
QueryDictの各(key, list)ペアに対して、dict形式の表現を返します。dictは、リストの中の要素の1つである item に対して、(key, item) のペアを持ちます。これは、QueryDict.__getitem__()と同じロジックを使用します。>>> q = QueryDict("a=1&a=3&a=5") >>> q.dict() {'a': '5'}
- QueryDict.urlencode(safe=None)Link to this definition
クエリ文字列形式のデータを文字列で返します。例えば:
>>> q = QueryDict("a=2&b=3&b=5") >>> q.urlencode() 'a=2&b=3&b=5'safeパラメータを使って、エンコードを不要とする文字を渡すことができます。たとえば:>>> q = QueryDict(mutable=True) >>> q["next"] = "/a&b/" >>> q.urlencode(safe="/") 'next=/a%26b/'
HttpResponse オブジェクトLink to this heading
- class HttpResponseLink to this definition
Django によって自動的に生成される HttpRequest オブジェクトとは対照的に、HttpResponse オブジェクトの作成はあなたの責任です。プログラム内に記述されるあらゆるビューは、HttpResponse をインスタンス化し、データを格納して返す必要があります。
HttpResponse クラスは django.http モジュール内に存在します。
使い方Link to this heading
文字列を渡すLink to this heading
一般的な使い方としては、ページのコンテンツを文字列、バイト文字列、または 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>")
イテレータを渡すLink to this heading
最後に、文字列ではなくイテレータを HttpResponse に渡すこともできます。 HttpResponse はイテレータを即座に受け取り、その内容を文字列として保存し、破棄します。ファイルやジェネレータのような close() メソッドを持つオブジェクトは、すぐに閉じられます。
レスポンスに対して、イテレータからクライアントにストリーミングさせる必要がある場合には、代わりに StreamingHttpResponse クラスを使う必要があります。
ヘッダーフィールドをセットするLink to this heading
レスポンスでヘッダーフィールドを設定または削除するには、 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 が発生します。
レスポンスをファイル添付物として扱うようにブラウザに指示します。Link to this heading
ブラウザにレスポンスをファイル添付として扱うように指示するためには、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 固有のものはありませんが、その構文を忘れやすいので、ここに含めています。
属性Link to this heading
- HttpResponse.contentLink to this definition
必要に応じて文字列からエンコードされた、コンテンツを表すバイト文字列。
- HttpResponse.textLink to this definition
-
レスポンスの
HttpResponse.charset(空の場合はUTF-8がデフォルト)を用いてデコードした、HttpResponse.contentの文字列表現。
- HttpResponse.cookiesLink to this definition
A
http.cookies.SimpleCookieobject holding the cookies included in the response.
- HttpResponse.headersLink to this definition
大文字小文字を区別しない辞書型オブジェクトで、
Set-Cookieヘッダを除くすべてのHTTPヘッダに対するインターフェイスを提供します。 ヘッダーフィールドをセットする およびHttpResponse.cookiesを参照してください。
- HttpResponse.charsetLink to this definition
応答がエンコードされる文字セットを示す文字列です。
HttpResponseのインスタンス化の際に指定されなかった場合、content_typeから抽出され、もしこれが失敗した場合は、DEFAULT_CHARSET設定が使用されます。
- HttpResponse.status_codeLink to this definition
レスポンスの HTTP ステータスコード 。
reason_phraseが明示的にセットされていない限り、コンストラクタの外でstatus_codeの値を変更するとreason_phraseの値も変更されます。
- HttpResponse.reason_phraseLink to this definition
レスポンスの HTTP reason フレーズです。これは HTTP 標準の デフォルトの reason フレーズを使用します。
reason_phraseが明示的に設定されていない場合、status_codeの値に基づいて決定されます。
- HttpResponse.streamingLink to this definition
これは常に
Falseです。この属性は、ミドルウェアが通常のレスポンスとは違う形でストリーミングレスポンスを扱えるようにするために存在しています。
- HttpResponse.closedLink to this definition
レスポンスが閉じられた場合、
Trueとなります。
メソッドLink to this heading
- HttpResponse.__init__(content=b'', content_type=None, status=200, reason=None, charset=None, headers=None)Link to this definition
指定されたページ内容、コンテンツタイプ、およびヘッダーを持つ
HttpResponseオブジェクトをインスタンス化します。contentは、最も一般的にはイテレータ、バイト文字列、memoryview、または文字列です。その他の型は、文字列表現をエンコードしてバイト文字列に変換されます。イテレータは文字列またはバイト文字列を返すべきで、それらはレスポンスの内容を形成するために連結されます。content_typeは、MIME タイプであり、オプションで文字セットエンコーディングを指定して HTTPContent-Typeヘッダを埋めるために使用されます。指定されていない場合、デフォルトでは'text/html'とDEFAULT_CHARSET設定によって形成されます: つまり"text/html; charset=utf-8"。statusis the HTTP status code for the response. You can use Python'shttp.HTTPStatusfor meaningful aliases, such asHTTPStatus.NO_CONTENT.reasonは HTTP レスポンスフレーズです。指定しない場合、デフォルトのフレーズが使用されます。charsetは、レスポンスがエンコードされる文字セットです。もし指定されていない場合、content_typeから抽出されます。それが失敗した場合は、DEFAULT_CHARSET設定が使用されます。headersはレスポンス用のHTTPヘッダーのdictです。
- HttpResponse.__setitem__(header, value)Link to this definition
指定されたヘッダ名に指定された値を設定します。
headerとvalueは共に文字列であるべきです。
- HttpResponse.__delitem__(header)Link to this definition
指定された名前のヘッダーを削除します。ヘッダーが存在しなくても、静かに失敗します。大文字小文字を区別しません。
- HttpResponse.__getitem__(header)Link to this definition
指定されたヘッダ名の値を返します。大文字小文字を区別しません。
- HttpResponse.get(header, alternate=None)Link to this definition
指定されたヘッダーの値を返します。ヘッダーが存在しない場合は、
alternateを返します。
- HttpResponse.has_header(header)Link to this definition
指定された名前のヘッダーが存在するかどうかを大文字小文字を区別せずにチェックし、
TrueまたはFalseを返します。
- HttpResponse.items()Link to this definition
レスポンスのHTTPヘッダに対して、
dict.items()のように動作します。
- HttpResponse.setdefault(header, value)Link to this definition
ヘッダーがまだ設定されていない場合に、ヘッダーを設定します。
- HttpResponse.set_cookie(key, value='', max_age=None, expires=None, path='/', domain=None, secure=False, httponly=False, samesite=None)Link to this definition
クッキーを設定します。パラメータは、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'(文字列) を使えば、このクッキーが同一サイトおよびクロスサイトのすべてのリクエストに送信されることを明示できます。
- HttpResponse.set_signed_cookie(key, value, salt='', max_age=None, expires=None, path='/', domain=None, secure=False, httponly=False, samesite=None)Link to this definition
Like
set_cookie(), but cryptographic signing the cookie before setting it. Use in conjunction withHttpRequest.get_signed_cookie(). You can use the optionalsaltargument to put the cookie into a separate signature namespace, but you will need to remember to pass it to the correspondingHttpRequest.get_signed_cookie()call.
- HttpResponse.delete_cookie(key, path='/', domain=None, samesite=None)Link to this definition
指定されたキーを持つクッキーを削除します。キーが存在しない場合は、静かに失敗します。
クッキーの動作方法により、
pathとdomainはset_cookie()で使用した値と同じでなければなりません。そうでない場合、クッキーが削除されない可能性があります。
- HttpResponse.close()Link to this definition
This method is called at the end of the request directly by the WSGI or ASGI server.
- HttpResponse.write(content)Link to this definition
このメソッドは、
HttpResponseインスタンスをファイルライクオブジェクトにします。
- HttpResponse.flush()Link to this definition
このメソッドは、
HttpResponseインスタンスをファイルライクオブジェクトにします。
- HttpResponse.tell()Link to this definition
このメソッドは、
HttpResponseインスタンスをファイルライクオブジェクトにします。
- HttpResponse.getvalue()Link to this definition
HttpResponse.contentの値を返します。このメソッドにより、HttpResponseインスタンスはストリームライクオブジェクトになります。
- HttpResponse.readable()Link to this definition
常に
Falseです。このメソッドはHttpResponseインスタンスをストリームライクオブジェクトにします。
- HttpResponse.seekable()Link to this definition
常に
Falseです。このメソッドはHttpResponseインスタンスをストリームライクオブジェクトにします。
- HttpResponse.writable()Link to this definition
常に
Trueです。このメソッドはHttpResponseインスタンスをストリームライクオブジェクトにします。
- HttpResponse.writelines(lines)Link to this definition
レスポンスに行のリストを書き込みます。行区切りは追加されません。このメソッドは、
HttpResponseインスタンスをストリームライクオブジェクトにします。
HttpResponse サブクラスLink to this heading
Djangoには、異なるタイプのHTTPレスポンスを処理するための HttpResponse のサブクラスがいくつか含まれています。 HttpResponse と同様に、これらのサブクラスは django.http に存在します。
- class HttpResponseRedirectLink to this definition
コンストラクタの第1引数は必須で、リダイレクト先のパスを指定します。これは、完全修飾URL(例:
'https://www.yahoo.com/search/')、ドメインを含まない絶対パス(例:'/search/')、あるいは相対パス(例:'search/')のいずれでも構いません。最後のケースでは、クライアントのブラウザが現在のパスに基づいて完全なURLを自動的に再構成します。コンストラクタはオプションの
preserve_requestキーワード引数を受け付け、既定値はFalseです。この場合、302 ステータスコードのレスポンスが生成されます。preserve_requestがTrueの場合は、代わりにステータスコードは 307 になります。その他のオプションのコンストラクタ引数については、
HttpResponseを参照してください。- urlLink to this definition
この読み取り専用の属性は、レスポンスがリダイレクトするURLを表しています (
Locationレスポンスヘッダに相当します)。
- class HttpResponsePermanentRedirectLink to this definition
HttpResponseRedirectに似ていますが、 "found" リダイレクト(ステータスコード 302)ではなく恒久的リダイレクト(HTTP ステータスコード 301)を返します。preserve_request=Trueの場合、レスポンスのステータスコードは 308 になります。
- class HttpResponseNotModifiedLink to this definition
コンストラクタは引数を取らず、このレスポンスにはコンテンツを追加すべきではありません。これを使用して、ページがユーザーの最後のリクエスト以降に変更されていないことを指定します(ステータスコード304)。
- class HttpResponseBadRequestLink to this definition
HttpResponseと似ていますが、ステータスコードとして 400 を使用します。
- class HttpResponseNotFoundLink to this definition
HttpResponseと似ていますが、404 ステータスコードを使用します。
- class HttpResponseForbiddenLink to this definition
HttpResponseと似ていますが、403 ステータスコードを使用します。
- class HttpResponseNotAllowedLink to this definition
HttpResponseと似ていますが、ステータスコード 405 を使用します。コンストラクタへの最初の引数は必須です: 許可されているメソッドのリスト (例:['GET', 'POST'])。
- class HttpResponseGoneLink to this definition
HttpResponseと似ていますが、410 ステータスコードを使用します。
- class HttpResponseServerErrorLink to this definition
HttpResponseと似ていますが、ステータスコードとして 500 を使用します。
カスタムレスポンスクラスLink to this heading
If you find yourself needing a response class that Django doesn't provide, you
can create it with the help of http.HTTPStatus. For example:
from http import HTTPStatus
from django.http import HttpResponse
class HttpResponseNoContent(HttpResponse):
status_code = HTTPStatus.NO_CONTENT
JsonResponse オブジェクトLink to this heading
- class JsonResponse(data, encoder=DjangoJSONEncoder, safe=True, json_dumps_params=None, **kwargs)Link to this definition
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()呼び出しに渡すキーワード引数の辞書です。
使い方Link to this heading
一般的な使用方法は以下のようになります:
>>> from django.http import JsonResponse
>>> response = JsonResponse({"foo": "bar"})
>>> response.content
b'{"foo": "bar"}'
辞書以外のオブジェクトのシリアライズLink to this heading
dict 以外のオブジェクトをシリアライズする場合、 safe パラメータを False に設定する必要があります:
>>> response = JsonResponse([1, 2, 3], safe=False)
safe=False を指定しなかった場合、TypeError が発生します。
dict オブジェクトに基づいた API は、より拡張性が高く、柔軟性があり、前方互換性の維持が容易になります。したがって、JSON エンコードされたレスポンスでは非 dict オブジェクトの使用は避けるべきです。
デフォルトのJSONエンコーダーを変更するLink to this heading
異なるJSONエンコーダークラスを使用する必要がある場合は、コンストラクターメソッドに encoder パラメータを渡すことができます。
>>> response = JsonResponse(data, encoder=MyJSONEncoder)
StreamingHttpResponse オブジェクトLink to this heading
- class StreamingHttpResponseLink to this definition
StreamingHttpResponse クラスは、Djangoからブラウザへのレスポンスをストリーミングするために使用されます。
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属性があります。これはミドルウェアでレスポンスのイテラブルをラップするために使用できますが、消費されるべきではありません。レスポンスオブジェクトを反復処理する必要があるため、
text属性を持ちません。ファイルライクオブジェクトの
tell()やwrite()メソッドは使用できません。これらを使用すると例外が発生します。
HttpResponse と StreamingHttpResponse は、共通の基底クラス HttpResponseBase を持っています。
属性Link to this heading
- StreamingHttpResponse.streaming_contentLink to this definition
レスポンス内容のイテレータ。 バイト文字列は
HttpResponse.charsetに従ってエンコードされます。
- StreamingHttpResponse.status_codeLink to this definition
レスポンスの HTTP ステータスコード 。
reason_phraseが明示的にセットされていない限り、コンストラクタの外でstatus_codeの値を変更するとreason_phraseの値も変更されます。
- StreamingHttpResponse.reason_phraseLink to this definition
レスポンスの HTTP reason フレーズです。これは HTTP 標準の デフォルトの reason フレーズを使用します。
reason_phraseが明示的に設定されていない場合、status_codeの値に基づいて決定されます。
- StreamingHttpResponse.streamingLink to this definition
これは常に
Trueです。
- StreamingHttpResponse.is_asyncLink to this definition
StreamingHttpResponse.streaming_contentが非同期イテレータであるかどうかを示す真偽値です。これは、
StreamingHttpResponse.streaming_contentをラップする必要があるミドルウェアにとって便利です。
切断の取り扱いLink to this heading
クライアントがストリーミングレスポンス中に切断されると、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 オブジェクトLink to this heading
- class FileResponse(open_file, as_attachment=False, filename='', **kwargs)Link to this definition
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"))
ファイルは自動的に閉じられるため、コンテキストマネージャーで開かないでください。
メソッドLink to this heading
- FileResponse.set_headers(open_file)Link to this definition
このメソッドはレスポンス初期化中に自動的に呼び出され、
open_fileに応じてさまざまなヘッダー (Content-Length、Content-Type、およびContent-Disposition) を設定します。
HttpResponseBase クラスLink to this heading
- class HttpResponseBaseLink to this definition
HttpResponseBase クラスは、Django のすべてのレスポンスに共通です。直接レスポンスを作成するために使用すべきではありませんが、型チェックの際に役立つことがあります。