あけましておめでとうございます。
2023年は皆さまにとってよりよい年になりますように。
問題背景
さて、年の初めからPythonフレームワークのFlaskを触っていると、GETメソッドについて壁にぶつかりました。
フォームはPOSTの形式でデータを送信します。ただ、POSTでリクエストするまでもない場合があります。
そこでクライアントからinputされたデータを、GET方式で送り返そうと思ったのですが。。。
<!DOCTYPE html>
<html>
<body>
<h1>入力したものを表示させる</h1>
<form method="GET" action="">
<label for="item">適当になんか入力してみて</label>
<input id="item" name="item">
<input type="submit" value="Submit">
</form>
<p>{{ item }}</p>
<!-- 受け取った情報をflaskのGETで返す -->
</body>
</html>
import requests
@app.route('/', methods=['GET'])
def Hello():
return render_template('sample.html')
@app.route('/', methods=['GET'])
def view():
input_data = request.args.get('item')
return render_template('sample.html', item = input_data)
しかしこれではGETがどちらかわからず、ただ、sample.htmlを表示させるだけとなります。残念ながら、itemが表示されません。
解決法
GETでデータの送信とルートに入ったときにただHTMLを表示させるという二つを区別するために、クエリパラメータが大事になります。
クエリパラメータとは、
URLの後ろについている?=&みたいなやつです。
例えば、Yahoo!の検索では、、、
https://search.yahoo.co.jp/search?p=%E9%AC%BC%E6%BB%85%E3%81%AE%E5%88%83%E6%AF%80%E6%BB%85&fr=top_ga1_sa&ei=UTF-8&ts=3965&aq=-1&oq=&at=&ai=944333f4-0630-4f45-a677-0e3ccda7fee4
のsearchの後ろについている?のようなものです。
つまり、GETではただHTMLを表示させることと、データ送信の二つをこのクエリパラメータによって判断するのです。
従って、これをPythonに落とし込むと、、
import requests
@app.route('/', methods=['GET'])
def view():
input_data = request.args.get('item')
if input_data is None:
return render_template('sample.html')
return render_template('sample.html', item = input_data)
とこんな感じになります。
これによって、クライアント側に表示させることができました。
これは、request.args
のargsプロパティにクエリパラメータを格納されるからだとされています。
参考文献
・「Flaskを使用してクエリパラメータを取得する」
https://www.delftstack.com/ja/howto/python-flask/flask-get-query-parameters/
・GETメソッドによるパラメータ渡し
https://zenn.dev/masahiro_toba/books/3daf7dc0d5dfd7/viewer/c07433