FlaskのHTTPメソッド処理を理解しよう
Flaskはモジュールで開発する
"Flask を使ってみよう"でflask run は現在の作業ディレクトリにある app.py を読み込むと説明しました。実際には、app モジュールをインポートしているわけです。 Flask はアプリケーションをモジュールベースで開発をしてゆきます。
このため、次のようなディレクトリ構造を持っている方が、アプリケーションを開発してゆくときに管理がしやすくなります。
code: ディレクトリ構造
project/
app/
__init__.py # アプリケーションのコア
templates/ # テンプレートファイル
ディレクトリ project で flask run が実行されると、app/__init__.py が読み込まれます。もちろん、環境変数 FLASK_APP で指定してもOKです。
HTTPメソッド
HTTPには、指定されたURLからのデータ取得のさまざまなメソッドがあります。
ただし、実際のHTTP通信で使われるメソッドはGETとPOSTがほとんどになります。
GET:ブラウザはサーバーに、該当ページのデータを送信するように要求します
デフォルトのメソッド
データは暗号化されていない形式のデータとして要求します。
データはブラウザの履歴やキャッシュに残ります。
HEAD:ヘッダー情報を要求します。
ページのコンテンツは期待していません。
GETリクエストであるかのように処理されますが、コンテンツは配信されません。
POST:処理されるHTMLフォームデータを送信するために使用されます。
ブラウザは、新しいデータをURLに投稿することをサーバーに通知します
一度だけ保存されます
POSTメソッドによって受信されたデータは、サーバー側ではキャッシュされません。
PUT:アップロードされたコンテンツに置き換えます。
DELETE:URLで指定されたターゲットリソースの内容を削除します。
CONNECT:要求接続を透過的なTCP / IPトンネルに変換します。
ルーティング
FlaskでURLを定義するroute() は、デフォルトではGETメソッドだけを扱います。しかし、認証ページはフォームデータを送信する必要があるので、POSTメソッドを処理させる必要があります。この’ようなときは、route() のキーワード引数methods= を与えて変更することができます。
code: Python
ログインページ
<form> タグを使ってログインページのフォームを作成します。
code: templates/index.html
<html>
<body>
<p> Enter Name:</p>
<p> <input type="text" name="name"></p>
<p> <input type="submit" name="submit"></p>
</form>
</body>
</html>
アプリケーションの定義
フォームデータを収集するためには、モジュール flask.request が必要になります。
HTTPメソッドによって、データの取得方法が違います。
GETリクエスト: request.args.get('フォームのINPUT名')
POSTリクエスト:request.form['フォームのINPUT名']
URL http://localhost:5000/login とアクセスされると、関数login()にマップされるようにしましょう。
code: app.py
from flask import Flask, redirect, url_for, request, render_template
app = Flask(__name__)
def login():
if request.method == 'POST':
return redirect(url_for('success', name=user))
else:
return render_template('index.html')
@app.route('/success/<name>')
def success(name):
return 'Welcome %s' % name
if __name__ == '__main__':
app.run(debug = True)
ブラウザでフォームを送信すると、URLhttp://localhost:5000/success/<name> の変数部分 <name> が入力したデータに置き換えられて、リダイレクトされます。
https://gyazo.com/71149f3874e0c455490f0be0d759eb8c
ここに、Python と入力してみると...
https://gyazo.com/278ccc717a44cff059dea7fabaafd64a
うまくいきましたね。
参考: