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