LoginSignup
14
6

More than 1 year has passed since last update.

Flask2でURLルーティングを別ファイルにまとめたい

Posted at

はじめに

Falskは非常にシンプルなフレームワークな故に、ファイルやディレクトの配置に悩めます
機能のひとつBlueprintを利用すれば、URLルーティングやビジネスロジックを分けられるので、ここで整理します

  • Flaskでルーティングを整理したい。ルーティング用のファイルにまとめたい。
  • アプリケーションを分割したい。
  • Laravelのweb.phpのようにルーティング用のファイルとアプリ(ビジネスロジック)を分割したい
  • Flask2の新機能であるネストも試してみる

以前の続き
EC2にPython/Flask2を構築
Flask2でGET/POSTの値を取得する

Falskの公式ドキュメント
https://flask.palletsprojects.com/en/2.0.x/

準備

起動用のファイルを作成。今回はrunコマンドではなく、app.run()で起動

app_bp.py
from flask import Flask, Blueprint
from route import web

app = Flask(__name__)

app.register_blueprint(web.bp)

if __name__ == "__main__":
  app.run()

register_blueprintで別ファイルのURLのルーティングを記述しているファイルを呼び出し
下のweb.pyファイルを作成してます
web.bpとあるのは、web.pyのbp変数をセットしています

web.pyにLaravelのweb.phpのようにURLのルーティングをまとめます
/yamada

route/web.py
from flask import Blueprint
from models import Yamada

bp = Blueprint('web', __name__, url_prefix="/yamada")

yamada = Yamada.Yamada()

@bp.get('/name')
def name():
  return yamada.name()

@bp.get('/age')
def age():
  return yamada.age()

@bp.get('/weight')
def weight():
  return yamada.weight()

yamadaクラスを用意して、そこにビジネスロジックを書くようにしてます
名前や年齢などを返すようにしてますね

models/Yamada.py
class Yamada:

  def name(self):
    return "山田です"

  def age(self):
    return "20歳"

  def weight(self):
    return "60Kg"

では実行してみます

python3 app_bp.py

Flask実行

curlで呼び出し

curl http://localhost:5000/yamada/name

山田です

表示されましたね

Blueprintのネストもやってみます
個人的にはルーティングの記述がわかりにくくなってしまいそうで使いたくないのですが
Githubなんかを読んでると需要があるようで待ち焦がれた機能のようです

ネストするルーティングファイルを用意します

route/web_sub.py
from flask import Blueprint
from models import Tarou

bp = Blueprint('web_sub', __name__, url_prefix="/tarou")

tarou = Tarou.Tarou()

@bp.get('/name')
def name():
  return tarou.name()

@bp.get('/age')
def age():
  return tarou.age()

@bp.get('/weight')
def weight():
  return tarou.weight()

web.pyにネスト用のweb_sub.pyを呼び出すようにします

route/web.py
from route import web_sub
bp.register_blueprint(web_sub.bp)

ビジネスロジック用のtarou.pyも用意

models/Tarou.py
class Tarou:

  def name(self):
    return "山田太郎です"

  def age(self):
    return "24歳"

  def weight(self):
    return "100Kg"

curlで呼び出し

curl http://localhost:5000/yamada/tarou/name

山田太郎です

yamadaにtarouがネストされて表示されましたね

まとめ

  • 一つのファイルが大きくなりがちなのをBlueprintを利用すれば、ファイル・ディレクトが整理できます
  • Falskの公式ドキュメントは分かりにくい

今回のサンプルコードはGitHubにアップしております
github/flask2_demo

14
6
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
14
6