Flask でアプリを作成する際に、よく (というか確実に) 利用するコードをまとめました。
オススメの利用方法
- Flask をこれから触る場合は、前もってどんなコードを書くのかをざっくり知る
- Flask を一通り学んだあとに、要約版として
プロジェクトファイルの構成
モジュールの場合とパッケージの場合で変わります。
ベストプラクティスとして こちら を参照しましした。
モジュールの場合
├─ app.py
├─ config.py
├─ requirements.txt
├─ static
│ └─[css_file].css
└──templates
├─ [html_file1].html
└─ [html_file2].html
パッケージの場合
├─config.py
├─requirements.txt
├─run.py
├─instance/
│ └─ config.py
└─yourapp/
├─ __init__.py
├─ views.py
├─ models.py
├─ forms.py
├─ static
│ └─ [css_file].css
└─ templates
├─ [html_file1].html
└─ [html_file2].html
ベースコード
Flask アプリは、flask.Flask() クラスから、アプリインスタンスを生成する必要があります。
“__name__” を渡しているのは、ルートパスを把握するためです。(Flask が “static” や “templates” フォルダーの場所を知るため)
from flask import Flask
app = Flask(__name__)
@app.route('/hello')
def hello():
return 'Hello, World!'
if __name__ == '__main__':
app.run(debug=True)
app.run()
は、デフォルトでローカスホスト (= 127.0.0.1) & ポート 5000 を利用します。
Routing (ルーティング)
ルーティングとは、URL とビュー関数 (リクエストに応じた動作を定義している関数) を紐付けるものです。
@app.route()
で設定するのが一般的 & 簡単です。
@app.route('/hello/<name>')
def hello(name):
return "Hello {} !".format(name)
@app.route(‘/hello/’) の最後のスラッシュ (“/”) ある・なしで動作がかわりますよ!
- スラッシュあり (@app.route(‘/hello/’))
- [exmple.com/hello], [exmple.com/hello/] ともに [exmple.com/hello/] となる
- スラッシュなし (@app.route(‘/hello’))
- [exmple.com/hello] のリクエストで、このデコレータで定義したビュー関数が実行される
- [exmple.com/hello/] のリクエストは、404 になる (Page Not Found)
>name< などの動的な変数を受け付けることもできます。
デフォルトは、str (>name< は、>str:name< として扱われる) として処理します。
他にも、int, float, path (ルーティングのパス) が利用できます。
リクエストメソッドの指定
クライアントから受け付ける HTTP メソッドを指定できます。
デフォルトでは、GET リクエストのみ受け付けます。
@app.route('/test') # 特に指定がないので GET リクエストのみ
@app.route('/test', methods=['GET', 'POST'])
@app.route('/test', methods=['PUT'])
Configuration
app.config[‘SECRET_KEY’]と直接、値を設定することもできますし、別ファイルで定義したものをインポートすることもできます。
こちらで確認できます。http://flask.pocoo.org/docs/1.0/api/#flask.Config
また、app.config で設定できるものは、インストールしたプラグインモジュールによりますので、必要に応じてマニュアルを見ましょ。
HTML テンプレート
Flask では、jinja2 テンプレートを利用しています。
from flask import render_template
@app.route('/')
def index():
return render_template('template_file.html', var1=value1, ...)
var1 は jinja2 テンプレート ([html_file].html] 内で扱う変数になります。
なので、jinja2 テンプレート内でも、object & list & dictionary が扱えます。
if 分や for 文と組み合わせることで、汎用的なテンプレートが作成できます。
JSON レスポンス
JSON レスポンスがちゃちゃっと実装できますので、Web API の提供が簡単にできます。
from flask import jsonify
@app.route('/api/return_some_stuff')
def return_some_stuff():
num_list = [1,2,3,4,5]
num_dict = {'numbers' : num_list, 'name' : 'Numbers'}
#returns {'output' : {'numbers' : [1,2,3,4,5], 'name' : 'Numbers'}}
return jsonify({'output' : num_dict})
リクエストデータの取扱
フォームから送付された情報は、オブジェクトとして簡単に取得できます。
from flask import request
request.args['name']
request.form['name']
request.method # HTTP リクエストの種類
request.cookies.get('cookie_name') # クッキーを取得
Redirect (リダイレクト)
url_for() と組み合わせて、ページをリダイレクトできます。
from flask import url_for, redirect
@app.route('/')
def index():
return render_template('home.html')
@app.route('/redirect/')
def redirect_example():
# url_for で index() に紐付いた URL を生成
# 生成された URL にリダイレクト
return redirect(url_for('index'))
Abort
エラーハンドラとして利用します。
from flask import abort
@app.route('/user/')
def get_user(id):
user = get_user(id)
if not user:
abort(404) # 404 エラーを返す
return "hello, {}".format(user.name)
Cookie 設定
レスポンスオブジェクトを make_response()
で生成し、そのオブジェクトにクッキー情報を格納できます。
from flask import make_response
@app.route('/')
def index():
response = make_response(render_template('index.html'))
response.set_cookie('cookie_name', 'cookie_value')
return response
Session の取扱い
クッキーはブラウザ側で編集が可能なため、サーバー側でもセッション情報を保持する必要があります。
import session
app.config['SECRET_KEY'] = 'random_string' # os.urandom() などで生成
# session を定義
@app.route('/login_success')
def login_success():
session['key_name'] = 'key_value'
return redirect(url_for('index'))
# read session
@app.route('/')
def index():
if 'key_name' in session:
session_var = session['key_value']
便利なプラグイン
こちらから プラグインを検索できます。