書籍 「Python FlaskによるWebアプリ開発入門 物 体検知アプリ&機械学習APIの作り方」 を通して伝えたいFlaskのプラクティス みんなのPython勉強会#80 佐藤昌基(taisa831)
taisa831 自己紹介
内容・対象 Flask入門
概要 書籍冒頭の文章一部抜粋 → スケールしやすいアプリの構成で開発するのに、ちょっとわかりにくい箇所に着目したプラ クティスの一例を紹介
Quickstart 1
Quickstart 1 https://flask.palletsprojects.com/en/2.1.x/quickstart/ 7行!
Quickstart 1 https://flask.palletsprojects.com/en/2.1.x/quickstart/ サーバ起動!
Quickstart 1 https://flask.palletsprojects.com/en/2.1.x/quickstart/ 表示された!
Quickstart 2
Quickstart 2 https://flask.palletsprojects.com/en/2.1.x/quickstart/ template にレンダリングするよう変更
Quickstart 2 https://flask.palletsprojects.com/en/2.1.x/quickstart/ `templates/index.html` を作成し変数を展開(Jinja2) {{ }}
Quickstart 2 イメージ
Quickstart 2 https://flask.palletsprojects.com/en/2.1.x/quickstart/ 表示された!
Quickstart 3
Quickstart 3 https://flask.palletsprojects.com/en/2.1.x/quickstart/ form を処理する
Quickstart 3 https://flask.palletsprojects.com/en/2.1.x/quickstart/ index.html に form 追加
Quickstart 3 https://flask.palletsprojects.com/en/2.1.x/quickstart/ post してみる
Quickstart 3 https://flask.palletsprojects.com/en/2.1.x/quickstart/ post form の値が受け取れた!
さて、ここからどうしよう 🤔
壁にぶつかる・・・ https://flask.palletsprojects.com/en/2.1.x/
徐々に本題へ Flask使う際に気になる箇所 - 環境変数(.env) - Context(g, current_app) - create_app(application factory) - config(local, dev, stg, prd, testing) - Blueprint
ちょっと前に戻って環境変数 .env から
ちょっと前に戻って環境変数 .env から 環境変数を毎回セットしたくないので、python-dotenv を利用する
ちょっと前に戻って環境変数 .env から (venv) $ pip install python-dotenv して .env ファイルに記載するだけでOK ```.env FLASK_APP=app.py FLASK_ENV=development ```
ちょっと前に戻って環境変数 .env から flask 本体(flask/src/cli.py)で .env があれば `load_dotenv` してくれる
ちょっと前に戻って環境変数 .env から ぷちまとめ `pip install python-dotenv` して .env に環境変数設定する
Context アプリケーションコンテキスト リクエストコンテキスト
Context アプリケーションコンテキスト アプリケーションコンテキストとは、リクエストの間、アプリレベルのデータを利用 できるようにするもの。アプリケーションレベルのデータには current_app と g がある。 current_app アクティブアプリ(実行中のアプリ)のインスタンス app = Flask(__name__) で取得した app にアクセスするとスケールするに従って 循環参照が発生しやすくなる。 → current_app にアクセスする g リクエストの間だけ利用できるグローバルなテンポラリ領域 リクエスト毎にリセットされる → リクエストの間だけ共通で利用したい値をセットする
Context アプリケーションコンテキスト エラーになる エラーにならない エラーになる 意図的に stack へ push エラーにならない エラーにならない
Context リクエストコンテキスト リクエストコンテキストとは、リクエストの間、リクエストレベルのデータを利用 できるようにするもの。リクエストレベルのデータには、request と session がある。 request session ※ 普通に利用するので詳細は割愛
Context コンテキストのライフサイクルイメージ ① start ① end
Context ぷちまとめ Flask アプリを使う際は current_app を使う グローバルに利用できるテンポラリ領域の g がある → リクエスト毎にリセットされるので注意
create_app application factory
create_app application factory create_appとは、アプリケーションファクトリーで Flask アプリケーションを起動 する関数です。create_app や make_app という名前で flask 本体でもサポー ト create_app か make_app があれば勝手に実行してくれ る
create_app application factory 指定しなくても create_app か make_app 関数があれば自動で実行 してくれる
create_app application factory create_app でなくても環境変数に :関数名 を指定すれば名前はなんでもよい 「:」で繋げて関数名を指定すればなん でもよい
create_app application factory create_app の引数によって実行するアプリケーションモードが変えられる -> local, dev, stg, prd, testing など config_key を引数に config_key によって読み込 む設定内容を変える
create_app application factory ぷちまとめ create_app でアプリを初期化し起動すると環境によってアプリの 切り替えが可能
config(dev, stg, prd, testing)
config(local, dev, stg, prd, testing) 各環境の config を用意する一例
config(local, dev, stg, prd, testing) 各環境用の .env を用意しておくだけでよい .env.local .env.dev .env.stg .env.prd
config(local, dev, stg, prd, testing) unittest 実行時も `create_app(“testing”)` を呼び出せばよい
config(local, dev, stg, prd, testing) ぷちまとめ config を環境別に用意し create_app の引数へ指定すると環境 の切り替えができる。テストもしやすくなる。
Blueprint
Blueprint Blueprint とは、アプリを分割するためのFlaskの機能。Blueprint を利用する ことで、アプリが大規模になっても簡潔な状態を保つことができる Blueprint の特徴と利用方法
Blueprint イメージ図
Blueprint Blueprint で認証機能(auth)を追加してみる
Blueprint Blueprint で認証機能(auth)を追加してみる auth アプリができる
Blueprint 複数の Blueprint でアプリを利用するには templates 直下に auth を挟む必 要あり。最初に登録した Blueprint のテンプレートが他の Blueprint のテンプ レートより優先され、2つ目以降の Blueprint のテンプレートが表示できなくな る。 auth/templates/auth/index.html
Blueprint flask route コマンドで route 情報をみてみると auth が登録されているのがわ かる
Blueprint Blueprint を使ってアプリを分割する単位のプラクティス(一例) 共通ログイン example.com shopping.example.com travel.example.com templates static (css, js) views templates static (css, js) views templates static (css, js) views templates static (css, js) views
Blueprint ぷちまとめ Blueprint を使うとアプリをスケールさせやすい templates のディレクトリ構成は少し特殊なので要注意
Appendix:SQLAlchemy
SQLAlchemy SQLAlchemy とは、Python 製の O/R マッパーです。O/Rマッパーは、データ ベースとプログラミング言語間の非互換なデータを変換します。そのため、 SQLAlchemyを利用すれば、SQL を記述せず Python のコードでデータベー スを操作できます。 Flask SQLAlchemy と migrate のインストール (venv) $ pip install flask-sqlalchemy flask-migrate
SQLAlchemy SQLAlchemy とは、Python 製の O/R マッパーです。O/Rマッパーは、 factory 内で初期化する
SQLAlchemy flask db が実行可能に flask コマンドに db が増えます
SQLAlchemy flask db が実行可能に flask コマンドに db が増えます
SQLAlchemy flask db init コマンドを実行すると migrations が生成されます
SQLAlchemy flask db init コマンドを実行すると migrations が生成されます
SQLAlchemy auth/models.py にモデルを定義する db.Model を継承したクラスを作 成する auth/__init__.py に import auth.models を追加しておく import auth.models
SQLAlchemy flask db migrate コマンドで migrate ファイルを生成
SQLAlchemy flask db upgrade コマンドで テーブルを生成
SQLAlchemy あとは SQLAlchemy の記述方 法に従ってコードを書く!
以上、ありがとうございました。

書籍 「Python FlaskによるWebアプリ開発入門 物体検知アプリ&機械学習APIの作り方」 を通して伝えたいFlaskのプラクティス.pdf