LoginSignup
0
1

More than 1 year has passed since last update.

FlaskでGETリクエストの二種類を駆使する

Posted at

あけましておめでとうございます。
2023年は皆さまにとってよりよい年になりますように。

問題背景

さて、年の初めからPythonフレームワークのFlaskを触っていると、GETメソッドについて壁にぶつかりました。
フォームはPOSTの形式でデータを送信します。ただ、POSTでリクエストするまでもない場合があります。
そこでクライアントからinputされたデータを、GET方式で送り返そうと思ったのですが。。。

sample.html
<!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>
sample_view.py
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に落とし込むと、、

sample_view.py 改
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

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1