日記

日々のことと、Python/Django/PHP/Laravel/nodejs などソフトウェア開発のことを書き綴ります

HttpRequestのあれこれ

今日は、HttpRequestです。

POST/GETの判別

HTMLフォームから送信されたパラメータが、どのメソッドで送信されたかを調べるには、以下のようなコードになります。

def method_check(request):
if request.method == 'POST':
# POSTでパラメータを送ってきたときの処理
pass
else:
# GETでパラメータを送ってきたときの処理
pass

パラメータを取得する

クライアントから送信されたパラメータを取得するコードは次のようになります。

def get_parameter(request):
if request.GET.has_key('param'):
param = request.GET['param']

requestは GET と POST それぞれに Dictionary があり、パラメータが管理されています。
このコードだとパラメータの有無を、has_key 関数を使って調べています。しかし、これだとパラメータの数が多い時に冗長で、面倒なことになります。以下のように書くと少しスマートな感じになるのではないかと。

param = request.GET.get('param', None)

これで、パラメータがあればそこに設定されている値を、設定されていない場合はNoneが返ってくるようになります。

HTTP リクエストヘッダーを取得する

User-Agentなど、クライアントが送信する情報を取得したいときも、同じようにそれ用のDictionaryが用意されています。

userAgent = request.META.get('HTTP_USER_AGENT', None)

ヘッダー情報の取得も簡単なのですが、微妙に実際のヘッダー名とはキーが異なるので注意です。
その他のキーはここを参照すると良いと思います。微妙に違うのは微妙にわかりにくい。

アクセスパスを調べる

ヘッダーが完全に HTTPヘッダー名=Django上のキー となっていないため、微妙な使いにくさを感じますが、Pathなんかも別のプロパティになっています。

under_hostname = request.path

こんな感じです。しかし、フルパスのURLや、ホスト名を取得するときは関数になっています。

hostname = request.get_host()

full_path = request.get_full_path()

なぜ、こういったわかれ方になっているのかは謎です。。。

QueryDictを自分で作る

最後に QueryDictを自分で作ってみます。

manage.py shell

Djangoのシェルにログインします。
次のコードを順々に実行していきます。

from django.http import QueryDict
query_string = QueryDict('a=1&b=2&c=3')

これで、QueryDictのインスタンスができます。コンストラクタに Query String を渡すとこれを自動的に分解して、連想配列のような形でパラメータにアクセスできます。

query_string.get('a')

この結果は

u'1'

こうなります。
QueryDictが単体で使えると、URL以外から取得した Query String も簡単に扱えますね。

まとめ

HttpRequestは、HTTPプロトコルをそのままバインドした形とは異なるので、Django流のHttpResponseになれる必要がありそう。まぁ、便利なんですけどね。。。

次は urls.py をもう少し突っ込んだ使い方をしてみたいと思います。