Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationEventAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
5
Help us understand the problem. What are the problem?
Organization

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

はじめに

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

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
5
Help us understand the problem. What are the problem?