revision-up-to: | 8961 (1.0) |
---|
Django は、システム全体にわたって、リクエストとレスポンスオブジェクトを使っ て処理状態を受け渡します。
あるページへのリクエストを受け取ると、Django は HttpRequest オブジェクトを生成します。このオブジェク トにはリクエストのメタデータが入っています。次に Django は適切なビューをロー ドして、 HttpRequest をビュー関数の最初の引数に渡しま す。各ビューは HttpResponse オブジェクトを返さねばな りません。
このドキュメントでは HttpRequest および HttpResponse オブジェクトの API について説明します。
session 以外の属性は全て読み出し専用です。
リクエストしているページのフルパスを表す、ドメインを含まない文字列です。
例: "/music/bands/the_beatles/"
リクエストに使われた HTTP メソッドを表す文字列です。必ず大文字になります。 例:
if request.method == 'GET':
do_something()
elif request.method == 'POST':
do_something_else()
提出されたフォームデータのデコードに使われる、現在のエンコーディングを 表す文字列です (None の場合もありますが、この場合は DEFAULT_CHARSET を使います)。この属性を変更すれば、フォーム データにアクセスする際に使われるエンコーディングを指定できます。一度エ ンコーディングを変更すると、変更後に (GET や POST の) 属性への アクセスはすべて新しい encoding の値に従って行われます。フォームデー タが DEFAULT_CHARSET 以外の特定のエンコーディングと分かって いる場合に便利です。
全ての HTTP POST パラメタが入った辞書ライクなオブジェクトです。後述の QueryDict も参照してください。
フォームを POST HTTP メソッドで要求し、その際に何らフォームデータを伴わ ないような場合には、リクエストが POST で送られていながらも POST 辞 書が空になることがあります。従って、リクエストが POST メソッドであるか どうかを調べるために if request.POST を使うべきではありません。代わ りに if request.method == "POST" を使ってください (上参照)。
POST にはファイルアップロードに関する情報は 入っていない ので注意 してください。 FILES を参照してください。
便宜的な辞書オブジェクトで、 POST パラメタをまず検索してから、次に GET パラメタを検索します。 PHP の $_REQUEST にインスパイアされ た機能です。
例えば、 GET = {"name": "john"} で POST = {"age": '34'} の場合、 REQUEST["name"] は "john" になり、 REQUEST["age"] は "34" になります。
通常は GET および POST を使うように強く勧めます。その方が明示的 だからです。
開発版の Django で変更された仕様
以前のバージョンの Django では、 request.FILES に通常の辞書が入っ ていて、その辞書がアップロードされたファイルを表していました。この 仕様は変更され、ファイルは後述の UploadedFile オブジェクトで表 現されるようになりました。
UploadedFile オブジェクトは、以前の辞書インタフェースをエミュレー トしていますが、これは撤廃されたインタフェースであり、次の Django のリリースでは除去される予定です。
アップロードされた全てのファイルが入っている辞書ライクオブジェクトです。 FILES の各キーは <input type="file" name="" /> の name に対応しています。 FILES の各値は UploadedFile オブジェクトで、 以下の属性を持っています:
詳しくは ファイルの管理 を参照してください。
FILES にデータが入るのは、リクエストが POST であり、かつリクエ ストをポストした <form> に enctype="multipart/form-data がある 場合だけです。それ以外の場合、 FILES は空の辞書ライクオブジェクトに なります。
標準の Python 辞書オブジェクトで、利用できる全ての HTTP ヘッダが入って います。利用可能なヘッダはクライアントとサーバごとに違いますが、例えば 以下のようなヘッダを利用できます:
現在ログインしているユーザを表す django.models.auth.models.User オブ ジェクトです。ユーザが現在ログインしていない場合には、 user は django.contrib.auth.models.AnonymousUser のインスタンスになります。 is_authenticated() を使うと、これら二種類のユーザを区別できます:
if request.user.is_authenticated(): # Do something for logged-in users. else: # Do something for anonymous users.
user を利用できるのは、 インストールした Django で AuthenticationMiddleware を有効にした場合だけです。詳しくは Django でのユーザ認証 を参照してください。
リクエストの送信元を HTTP_X_FORWARDED_HOST または HTTP_HOST ヘッ ダを (順に) 調べて返します。クライアントがこれらの値を提供していない場合、 PEP 333 に従って、 SERVER_NAME と SERVER_PORT の組み合わせを 返します。
Example: "127.0.0.1:8000"
path と、そのあとに続くクエリ文字列があれば返します。
例: "/music/bands/the_beatles/?print=true"
location の絶対 URI を計算して返します。引数 location を省略する と、 location の値として request.get_full_path() を使います。
location の値がすでに絶対 URI であれば、値を変更しません。そうでない 場合、リクエスト中のサーバに関する変数を使って URI を構築します。
例: "http://example.com/music/bands/the_beatles/?print=true"
リクエストが XMLHttpRequest である場合には True に設定されます。 リクエストが XMLHttpRequest であるかどうかは、 HTTP_X_REQUESTED_WITH ヘッダに文字列 XMLHttpRequest があるかどう かで判別します。このヘッダは、以下のような主要 JavaScript ライブラリでサ ポートされています:
ブラウザ側で XMLHttpRequest を呼び出す独自のコードを書いている場合、 is_ajax() を正しく機能させたいなら、 HTTP_X_REQUESTED_WITH ヘッ ダを適切に設定してください。
HttpRequest オブジェクト内では、 GET と POST 属性は django.http.QueryDict のインスタンスです。 QueryDict は辞書ライクなクラスで、同じキーに対して複 数の値を取り得るようにカスタマイズされています。これは、 HTML のフォーム要 素には、例えば <select multiple="multiple"> のように、同じキーに対して 複数の値を渡すものがあるからです。
QueryDict インスタンスは、 copy() を作らないかぎ り変更できません。これは、 request.POST や request.GET の属性を直接 変更できないということです。
QueryDict は辞書型のサブクラスなので、全ての標準的な 辞書型のメソッドを実装しています。ただし、以下の点が異なります:
QueryDict または標準の辞書型を引数にとります。標 準の辞書型の update() メソッドと同じですが、現在の値を置き換えるの ではなく、現在の値のリストに 追加 します。例えば:
>>> q = QueryDict('a=1')
>>> q = q.copy() # to make it mutable
>>> q.update({'a': '2'})
>>> q.getlist('a')
['1', '2']
>>> q['a'] # returns the last
['2']
標準の辞書型の items() メソッドと同じですが、 __getitem()__ と 同じ、最後の値を返すロジックを使います。例えば:
>>> q = QueryDict('a=1&a=2&a=3')
>>> q.items()
[('a', '3')]
values() -- 標準の辞書型の values() メソッドと同じですが、 __getitem()__ と同じ、最後の値を返すロジックを使います。例えば:
>>> q = QueryDict('a=1&a=2&a=3')
>>> q.values()
['3']
加えて、 QueryDict には以下のメソッドがあります:
>>> q = QueryDict('a=1&a=2&a=3')
>>> q.lists()
[('a', ['1', '2', '3'])]
GET, POST, COOKIES, FILES, META, REQUEST, raw_post_data および user といった属性はすべて遅延読み込み (lazily load) されます。すなわち、 Django はコード中で要求されるまで、これらの値を 計算するためにリソースを消費しません。
Django によって自動生成される HttpRequest オブジェク トとは対象的に、 HttpResponse オブジェクトは自分で生 成せねばなりません。ビューを書くときにはいつでも、 HttpResponse インスタンスを生成して、値を設定し、戻り 値として返さねばなりません。
HttpResponse クラスは django.http モジュールで定 義されています。
HttpResponse の典型的な使い方は、ページの内容を文字列 としてコンストラクタに渡すというものです:
>>> response = HttpResponse("Here's the text of the Web page.")
>>> response = HttpResponse("Text only, please.", mimetype="text/plain")
コンテンツを累積的に追加していきたい場合には、 response をファイルライ クオブジェクトのようにも使えます:
>>> response = HttpResponse()
>>> response.write("<p>Here's the text of the Web page.</p>")
>>> response.write("<p>Here's another paragraph.</p>")
ヘッダの追加や削除は辞書とおなじ書法で書けます:
>>> response = HttpResponse()
>>> response['X-DJANGO'] = "It's the best."
>>> del response['X-PHP']
>>> response['X-DJANGO']
"It's the best."
該当するヘッダがなくても、 del は KeyError を送出しないので気をつけ てください。
最後に、ハードコードされた文字列ではなくイテレータも HttpResponse に渡せます。このテクニックを使う場合は以 下のガイドラインに従って下さい:
レスポンスのヘッダをセットするには、レスポンスを辞書のように扱います:
>>> response = HttpResponse()
>>> response['Pragma'] = 'no-cache'
レスポンスをブラウザにファイルアタッチメントとして扱わせるには、 mimetype 引数を使い、 Content-Disposition ヘッダをセットしてくださ い。例えば、 Microsoft Excel のスプレッドシートを返すには、以下のようにしま す:
>>> response = HttpResponse(my_data, mimetype='application/vnd.ms-excel')
>>> response['Content-Disposition'] = 'attachment; filename=foo.xls'
Content-Disposition ヘッダの利用は Django 固有の仕様ではありませんが、 記法を忘れやすいのでここに示しておきます。
指定のページコンテンツ (文字列) と MIME タイプで HttpResponse オブジェクトをインスタンス化します。 DEFAULT_CONTENT_TYPE は 'text/html' です。
content はイテレータまたは文字列にできます。イテレータにする場合、 イテレータは文字列を返さねばなりません。イテレータを指定した場合、レス ポンスの内容はイテレータの返す文字列を結合して生成されます。
status はレスポンスの HTTP 状態コード です。
content_type は mimetype の別名にすぎません。以前、このパラメタ には mimetype という名前しかありませんでしたが、実際のところ、この パラメタに指定する値は HTTP の Content-Type ヘッダに入る内容であり、 MIME タイプ仕様にはない文字セットエンコーディングの指定を含んでいました。 そこで、 mimetype が指定されている (None でない) 場合にはその値 を使い、それ以外の場合には content_type を使うように変更しました。 どちらのパラメタも省略すると、 DEFAULT_CONTENT_TYPE 設定を使 います。
クッキーを設定します。パラメタは Python 標準ライブラリの Morsel オブジェクト と同じ形式です。
指定のキーに対するクッキーを削除します。キーが存在しなければ、暗黙のう ちに失敗します。
cookie の動作原理上、 path と domain を set_cookie() に指定 した値と同じにしないと、クッキーを削除できなくなります。
Django には、様々なタイプの HTTP レスポンスを扱うための HttpResponse のサブクラスがあります。これらのサブクラ スは HttpResponse と同じく django.http モジュー ルにあります。
HttpResponse と同じように振舞いますが、状態コード 400 を使います。
Aug 31, 2012