0utputab1e

[ Python ] FlaskでHTTP Get Postを使ってみる

 2020-07-04
 

今回の記事では、FlaskアプリケーションでHTTPメソッドのGET、POSTを使って値のやり取りをしてみようと思います。
ちょっと手を加えて、過去の記事の発展形を作っていこうと思います。

環境

過去の記事で使用した以下の構成で行います。

  • Python: 3.5.6
  • pip: 20.1.1
  • Flask: 1.1.1
  • Jinja2: 2.10.1(Flaskインストールでついてくる)

 
※Flaskの導入方法は過去の記事からご覧になれます。

ディレクトリ構成

以下の構成で作成していきます。

$ tree
.
├── index.py
└── templates
    ├── base.html
    └── index.html

1 directory, 3 files

各ファイルの作成

アプリケーションファイルの作成

  • index.py
from flask import Flask, render_template, request

app = Flask(__name__)

@app.route('/', methods=['GET', 'POST'])
def index():
    title = "send message"
    try:
        if request.method == 'POST':
            message = request.form['message']
        else:
            message = request.args.get('message', 'not message')
        return render_template("index.html", title=title, message=message)
    except Exception as e:
        return render_template("index.html", title=title, message="Failed to get message")

if __name__ == '__main__':
    app.run(debug=True, threaded=True, host="localhost", port=3000)

 
上記の例で行くと、URLパス「"/"」で対応するHTTPメソッドは

@app.route('/', methods=['GET', 'POST'])

のように、@app.route()の第2引数に文字列型のリスト型でmethodsプロパティに渡します。

 
また、リクエストメソッドが何で来ているかは

request.method

のように呼び出すことで、アッパーケース(全部大文字)の文字列で取得できます。

 
また、GETで受け取ったURLパラメータの値を取得するには

request.args.get('URL語尾の「?key=value」に指定したkeyの部分名', '取得する値がない場合のデフォルト値')

で、

POSTで受け取ったフォームの値を取得するには

request.form['input nameに指定したキー名']

で値を取得できます。

 
処理中に例外が起きたときの対策には、try-except文で対応できます。

※上記のプログラムでは、
reqest.form[‘key’]などで失敗したとき、catch側に分岐するようにしています。

 
ちなみに

request.form['username']

では値を取得できなかったときにエラー(werkzeug.exceptions.BadRequestKeyError)になるので、

request.form.get('username', None)

のように第2引数に値を指定して、要求するキーで値を取得できなかったときのデフォルト値を決めることもできます。

テンプレートファイルの作成

次にテンプレートの作成に移ります。

  • templates/base.html
<!DOCTYPE html>
    <html>
        <head>
            <meta charset="utf-8"/>
            <title>{{ title }}</title>
        </head>
        <body>
        {% block content %}
        <!--ここに部品としてのHTMLを入れることになります-->
        {% endblock %}
        </body>
    </html>
  • base.html
<!--extendsの部分は、base.htmlをベースにテンプレートを組み立てるおまじないです-->
{% extends "base.html" %}
{% block content %}
<form action="/" method="POST">
    <p><span>message: </span>{{ message }}</p>
    <input type="text" name="message" value="{{ message }}">
    <button type="submit">メッセージを送信する</button>
</form>
{% endblock %}

アプリケーションの起動

上記のコードを作成したら、ターミナルからアプリケーションを起動します。

$ python index.py

アプリケーションにアクセスしてみる

無事起動したら、ブラウザからフォーム画面が確認できます。

  • メッセージ入力画面
    メッセージ入力画面

  • メッセージ送信後画面
    ( GET(URLの語尾に「?message=from-url-param」をつけてアクセス) )
    メッセージ送信後画面

  • メッセージ送信後画面
    ( POST(フォームに入力し、ENTER or 送信ボタンで送信) )
    メッセージ送信後画面

  • input nameをブラウザから書き換え送信後画面
    ( POST(サーバ側でリクエストキーの取得ができず、exceptの方の結果が返ってくる) )
    メッセージ送信後画面

やった、アプリケーションと値のやり取りができました!

今回はここまでにしましょう。

では、また次回に!

 

あわせて読みたい記事

>> Homeに戻る