• request.getとrequest.GETの違いを解説【順を追って説明します】

    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を使うことが一般的。

    ~Django無料講義~のご案内

    Code for Djangoが、4時間超の無料Django講義をはじめました

    •  ・本を出版したCode for Djangoの
       製作者が作ったサイトです。
    •  ・Code for Djangoの内容も、
       動画で詳しく解説しています。
    •  ・動画は順次ふやしていきますので、
       ただで学び続けることが可能です。
    •  ・Djangoの効率的なスキルアップに、
       是非お役立て下さい。