request.getと、request.GET.getの違いについて学んでいきましょう。
request.getとrequest.GETの違いは?
一言で言うと、request.getはpythonの文法であり、request.GETはdjangoの文法とイメージすると分かりやすいです。
また、request.GETを使うと、getリクエストを送った時のパラーメーターも取得できるということが特徴です。
順番に理解を進めていきましょう。
request.getを分解する
まずはrequest.getです。
これは、requestという名前のオブジェクトに対し、getメソッドを実行しています。
この時、requestオブジェクトは辞書型のデータであることを意識しましょう。
具体的なコードでみていきます。
コードrequest = {'key':10, 'animal':'cat'}
request.get('key')
アウトプット10
requestというオブジェクトに対し、getメソッドを使ってデータを取り出しました。
getメソッドが使えるのは、辞書型のオブジェクト
ただ、一つ注意することがあります。
それは、getメソッドが使えるのは辞書型のオブジェクトということです。
djangoでfunction based viewを定義した時の引数として設定する「request」は辞書型のデータではないことに注意しましょう。
試しにrequest.getを取得してみます。
コードdef fbv(request):
print(request.get(''))
return HttpResponse('')
コマンドラインAttributeError: 'WSGIRequest' object has no attribute 'get'
WSGIRequestオブジェクトはget属性がありません、というエラーが出てしまいました。
つまり、requestは辞書型のオブジェクトではないのです。
request.GETを分解する
次に、request.GETについてみていきましょう。
request.GETはdjangoで使われます。
さきほど確認しましたが、requestはHttpリクエストが送られたときにDjangoが作るオブジェクトです。
そして、request.GETを実行することで、requestの情報を辞書型のデータで取得することができるようになります。
つまり、request.GETとすることにより、getメソッドを使ってデータを取得することができるようになるのです。
実際のコードで確認
request.GETで実際にデータを取得してみましょう。
なお、基本的なコードの設定は初期設定コードという記事に書いていますので参考にしてください。
まずは、前提として、以下のurlを書いた場合を見ていきます。
http://localhost:8000/fbv/?q=100
urlにq=100というパラメーターを加えました。
このパラメーターをrequest.GETで取得してみましょう。
コードdef fbv(request):
print(request.GET['q'])
return HttpResponse('')
コマンドライン100
しっかりとurlのパラメーターが取得できていることが確認できました。
辞書に無いデータを参照した場合
さらにrequest.GETに対する理解を深めていきましょう。
例えば、request.GET型の辞書にないパラメーターを参照した場合はどうなるでしょうか?
実際のコードで見ていきましょう。
コードdef fbv(request):
print(request.GET['somekey'])
return HttpResponse('')
コマンドラインdjango.utils.datastructures.MultiValueDictKeyError: 'somekey'
エラーが出てしまいました。
request.GET.getが便利
ですので、djangoでは、requestの内容を取り出すときは、request.GET.getを使うことが一般的です。
なぜなら、getメソッドは、対象とするデータがない場合、Noneを返してくれるからです。
これも実際のコードで確認していきましょう。
コードdef fbv(request):
print(request.GET.get('somekey'))
return HttpResponse('')
コマンドラインNone
Noneが返ってきていることが確認できました。
request.getとrequest.GETのまとめ
(1) get()はpythonのメソッド。対象は辞書型のデータ。
(2) djangoのrequestは辞書型ではない。
(3) requestを辞書型に変えるのがrequest.GET。
(4) エラーを出さないためには、request.GET.getを使うことが一般的。