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 も簡単に扱えますね。