【django】views.py:request.POST/GETから値を取得する方法(get、getlist)

時計 2021.06.17 / 時計

【django】views.py:request.POST/GETから値を取得する方法(get、getlist)

本記事ではdjangoのviews.pyで、HTTPリクエストのPOSTまたはGET方式から値を取得する方法を解説していきます。

Webアプリケーションでは、ユーザーがWebサイトを通してHTTPリクエスト(request)をWebサーバーに送信します。

送信されるデータは、ログイン情報やフォームに入力した情報などです。

これらデータをサーバー側で取得して、次に表示するページに反映したり、データベースに登録したりします。

こういったことを実現するためには、本記事で紹介するviews.pyでHTTPリクエストからデータを取得する方法を知る必要があります。

ぜひ本記事でHTTPリクエスト(GET/POST)の知識を深めてください。

HTTPリクエスト(GET/POST)

Webサイトを表示するために使用されるHTTP(Hypertext Transfer Protocol)を介して、Webサーバーに送られるリクエスト(要求)をHTTPリクエストと呼びます。

クライアントとサーバー:HTTPリクエストの流れ

HTTPリクエストはクライアント側からWebサーバーに送信されます。

HTTPリクエストには「GET」と「POST」の2種類があります。

HTTPリクエスト:GETとは

HTTPリクエストのGET方式は、URLの末尾にパラメーターを追加して送信するリクエスト方法です。

以下にHTTPリクエストのGETによるリクエスト例を記します。

https://office54.net/python?id=54&type=5

GET方式では、URLの「?」からパラメーターが始まります。

そして「キー=値」でパラメーターをサーバーに渡しています。
パラメーターが複数ある場合、パラメーターを「&」で連結します。

このようにURLにパラメーターを追加するため、サーバーに送信する内容(パラメーター)
が丸見えになってしまいます。

そのため重要な情報(個人情報やパスワードなど)はGETではなく、POSTで送信するのが一般的です。

またURLに追加して送信するため、長いデータは送信できません。

HTTPリクエスト:POSTとは

HTTPリクエストのPOST方式は、GET方式と同じようにサーバーにパラメーター(キー=値)を送信します。

id=54&type=5

パラメーターの格納場所はHTTPのBody部になりますので、GETと異なり個人情報やパスワードなども安心してサーバーに送信することができます。

そのためPOST方式は、ユーザーが入力したデータをWebサーバーに送信するときに主に使用されます。

GET/POSTから値(request)を取得する

djangoにおいて、ユーザーがWebサイトを通してHttpリクエスト(GETまたはPOST)を送信すると、django(Webサーバー)ではrequestオブジェクトを受け取ります。

requestとは

すでに述べていますが、requestはdjangoが受け取るWebサイトからのHttpリクエストです。

GET方式であればrequest.GETとすることで、POST方式であればrequest.POSTとすることでrequestからデータを辞書型で取得できます。

例えばGETで次のように送られたデータをrequest.GETで取得してみます。

https://office54.net/python?id=54&type=5

def office(request):
    print(request.GET["id"])
# 54

request.GETまたはrequest.POSTの注意点としては、辞書に存在しないキーを指定した場合はエラーが出てしまいます。

そのため基本的には次項から説明するget()メソッドまたはgetlist()メソッドを使いましょう。

get()メソッドを使用

get()メソッドとは

get()メソッドは辞書型のオブジェクトから値を取得するために使用します。

辞書型オブジェクト.get(key, default=None)

ご存じのように辞書型とは、キーと値(バリュー)を組み合わせたデータ型です。

get()メソッドでは第一引数にキーを指定し、第二引数にそのキーが存在しなかった場合に返す値を指定します。
第二引数は指定しなければ、デフォルトのNoneが返されるようになります。

items = {'book': 10, 'pen': 20}
items.get('book')
items.get('note')
# 10
# None

get()メソッドを使わずに辞書データにアクセスした場合、存在しないキーにアクセスするとエラーが発生してしまいます。
そのため辞書型データのアクセスには、get()メソッドを一般的には使います。

requestからデータを取得

requestからget()メソッドを使ってデータを取得する場合、次のように記述します。

request.GET.get(key, None)
request.POST.get(key, None)

例えばGETで次のように送られたデータをget()メソッドで取得してみます。

https://office54.net/python?id=54&type=5

def office(request):
    print(request.GET.get("id"))
# 54

複数の同じキー(name属性)がある場合

同じ名前のキー(name属性)を持っているinputタグがある場合、request.GET.get()では最後のinputタグの値を取得します。

<form method="post">
    
    <input type="textbox" value="a" name="office">
    <input type="textbox" value="b" name="office">
    <input type="textbox" value="c" name="office">
    <input type="submit" id="button" name="button" value="送信">
</form>
def office(request):
print(request.POST.get())
# c

同じname属性の値を取得するには次に説明するgetlist()メソッドを使用します。

getlist()メソッドを使用

getlist()メソッドとは

getlist()メソッドは辞書型のオブジェクトから値をリストとして取得します。

辞書型オブジェクト.getlist(key, default=None)

引数の指定方法はget()メソッドと同じです。

requestからデータを取得

requestからgetlist()メソッドを使ってデータを取得する場合、次のように記述します。

request.GET.getlist(key, None)
request.POST.getlist(key, None)

例えばGETで次のように送られたデータをget()メソッドで取得してみます。

https://office54.net/python?id=54&id=55&type=5

def office(request):
    print(request.GET.getlist("id"))
# [54, 55]

複数の同じキー(name属性)がある場合

request.GET.getlist()では、複数のinputタグが同一のname属性を持っていても、すべての値をリストで取得できます。

getlist()の引数には取得したいinputタグのname属性を指定します。

<form method="post">
    
    <input type="textbox" value="a" name="office">
    <input type="textbox" value="b" name="office">
    <input type="textbox" value="c" name="office">
    <input type="submit" id="button" name="button" value="送信">
</form>
def office(request):
print(request.POST.get("office"))
# [a, b, c]

まとめ

本記事「【django】views.py:request.POST/GETから値を取得する方法(get、getlist)」はいかがでしたか。

フォーム入力から送信されたデータをviews.pyで操作する場合、request.POST/GETから値を取得する知識は必須となります。

ぜひマスターしてWebアプリケーション開発の幅を広げてください。