【Python】FlaskでWebアプリケーションを作る⑦ -GETとPOSTでリクエストを受け取る

今回はFlask WebアプリケーションでHTTPリクエスト(GET, POST)を受け取る方法を紹介します。

GETとPOSTとは?

Webアプリケーションを利用する際、私たちが使用しているPC、スマートフォン(以後クライアントと呼ぶ)とWebサーバの間では当然ながらやり取りが行われます。

基本的にはクライアントからWebアプリのどのページを見たいなど、サーバに対してリクエストすることになります。サーバは、クライアントからのリクエストに対して画面のHTMLを返す等応答(レスポンス)します。リクエストはURLとしてクライアントからサーバに送信します。

GETやPOSTはそのリクエストの仕方を指しています。HTTPのリクエストメソッドにはいくつか種類がありますが、GET、POSTが主によく使われます。

クライアントからのリクエストする際には、具体的な情報を併せてサーバに送信する必要があります。「〇〇が見たい」ではなく、「ページ番号△△にアクセスしたい」や「IDが〇〇、パスワードがXXXでログインしたい」等です。これら情報は、リクエストURLにパラメータとして付加し、一緒に送信します。

GETとPOSTの違いと使い分け

GETとPOSTの違いは、上記のような具体的な情報(データ)をURLのどこに持つか?という点にあります。GETはURLにデータを含めて送信します。一方でPOSTはHTTPリクエストボディにデータを含め送信します。

GET

GETはURLにデータを含めて送信します。データはURLの末尾付加されます(?以降)。以下のURLの場合、q=keywordがデータです。

http://example.com/search?q=keyword

GETはWebページを取得する等データを取得する場合に用います。このときのデータには表示したいページ番号等の情報が入ります。

GETの場合URLに全情報が含まれてしまうため、外部から中身が見えてしまいます。なので、個人情報等データのやり取りには向きません。

POST

POSTはHTTPリクエストボディにデータを含め送信します。

POST /search HTTP/1.1
Host: example.com
Content-Type: application/x-www-form-urlencoded

q=keyword

一方POSTはログイン情報や、入力フォームの情報を送信する場合に用います。

こちらの場合はURLにはデータが含まれないので、外部からの秘匿性はGETに比べ高いです。従って、個人情報等秘匿しないといけないデータのやり取りはPOSTを使用します。(もちろん、POSTだから100%安全というわけではありません。通信の暗号化等対策は別途必要です。)

またやり取りするデータ量が多い場合も、GETではURLに乗り切らないためPOSTを使用する必要があります。

Flaskで実装

FlaskでGETとPOSTそれぞれでデータを受け取る関数を定義してみます。リクエストメソッドは@app.route()の引数にて指定します。

from flask import Flask, request

app = Flask(__name__)

# GETリクエストを受け取る関数
def get():
    name = request.args.get('name')
    return 'Hello, GET, {}!'.format(name)

# POSTリクエストを受け取る関数
@app.route('/', methods=['POST'])
def post():
    message = request.form.get('message')
    return 'Message: ' + message

if __name__ == '__main__':
    app.run()

get()、post()ともにhttp://localhost:5000/でアクセスしますが、リクエストメソッドによって処理内容が異なります。

GETで渡されるデータはrequest.args.get(‘xxx’)で受け取ります。’xxx’は任意のキーです。今回はnameというパラメータでデータを渡すようにします。

POSTで渡されるデータはrequest.form[‘xxx’]で受け取ります。

※今回はContent-Type: application/x-www-form-urlencodedの場合を前提としていますが、Content-Typeの違いによってFlaskでのデータの受け取り方が若干異なります。

GETリクエストの確認

まずはGETリクエストを確認してみます。GETを確認するには、ブラウザでcurl -X GET http://localhost:5000/?name=naoにアクセスします。

今回パラメータには’name’という名前で渡すことになっているので、name=〇〇の形にします。

curl -X GET http://localhost:5000/?name=nao

curlを使う場合は以下コマンドを実行します(コマンドプロンプト等で実行してください)。”Hello, GET!”というメッセージが返ってくればOKです。

curl -X GET http://localhost:5000/?name=nao

>> Hello, GET, nao!

POSTリクエストの確認

POSTの確認はcurlにて行います。以下のコマンドを実行してみます。curlでPOSTにおけるデータを付与するには、-dパラメータを用います。

curl -X POST -d "message=Hello, Flask!" http://localhost:5000/

>> Message: Hello, Flask!

まとめ

Flask WebアプリケーションでHTTPリクエスト(GET, POST)を受け取る方法を紹介しました。

GET、POSTでは役割が異なるので、目的に応じて使い分ける必要があります。データの授受は最適な方法で実施するようにしてください。

ではでは👋