Flaskの導入マニュアルに沿って構築していくと、app.pyというファイルにメインの処理をどんどん書いていくかと思います。
個人差はありますが、一つのアプリケーションを作成するのに1ファイルだけ、というのは可読性の点からも怠くなってくるでしょう。
しかしFlaskをローカル実行する際に、実行ファイルを1つしか指定できないことから、分割する際の手順がちょっとわかりにくいです。
そこで今回はapp.pyに定義したエンドポイントを、別ファイルに分割する方法をご紹介します。
分割前のファイル
分割前のapp.pyを以下とします。
from flask import Flask
app = Flask(__name__)
@app.route("/get/ok", methods=["GET"])
def get_ok():
return "OK"
@app.route("/get/ng", methods=["GET"])
def get_ng():
return "NG"
かなり適当ですが、そこはご愛敬。
分割後のイメージ
うむ。適当である。
分割後のファイル
分割後は各ファイル以下のようになります。(実装の順番で表示しています)
ok.py
from flask import Blueprint
ok_module = Blueprint("ok", __name__)
@ok_module.route("/get/ok", methods=["GET"])
def get_ok():
return "OK"
ng.py
from flask import Blueprint
ng_module = Blueprint("ng", __name__)
@ng_module.route("/get/ng", methods=["GET"])
def get_ng():
return "NG"
app.py
from flask import Flask
app = Flask(__name__)
app.register_blueprint(ok_module)
app.register_blueprint(ng_module)
やってること
難しいコードではないので直感的に分かるかもしれませんが、ok.pyとng.pyをモジュールとして定義し、アプリケーションに認識させているだけです。
「Blueprint」という言葉は詳しくは調べていませんが、ピンとくる人にはピンとくるのかもしれません。
最後に
app.pyだけを編集していると、エンドポイントだけではなく共通関数まで入り込んできてしまい、分割までの間はかなり生産性が低下しました。
コピペしても、一番下から一番上にコピーしたりするとルーティングが間違っているかどうかも動かさないと分からなかったり…。
プロジェクト構成のベストプラクティスはどのようになるのか分かりませんが、適宜分割して分けていけばいい感じになるのかな?センスが問われますね。
以上です。