さらっとだけ触ってみたのでメモ
とりあえず起動してみる
pyenv、poetryを使って、Hello Flask!
# プロジェクトを作成し、その中に移動
mkdir sample
cd sample
# ローカルで使用するPythonのバージョンを指定
pyenv local 3.9.7
# 対話無しデフォのpyproject.toml作成
poetry init --no-interaction
# flaskを追加
poetry add flask
引数無しの poetry init を実行すると
This command will guide you through creating your pyproject.toml config.
Package name [sample]:
Version[0.1.0]:
Description []:
Author [None, n to skip]:
License []:
Compatible Python versions [>=3.9]:
Would you like to define your main dependencies interactively? (yes/no) [yes]
Would you like to define your development dependencies interactively? (yes/no) [yes]
AuthorはNone、Would you~は、Noで他はEnterで
pyproject.tomlの中身
[project]
name = "sample"
version = "0.1.0"
description = ""
authors = [
{name = "Your Name",email = "you@example.com"}
]
readme = "README.md"
requires-python = ">=3.9"
dependencies = [
]
[build-system]
requires = ["poetry-core>=2.0.0,<3.0.0"]
build-backend = "poetry.core.masonry.api"
ちょっと学習のためコードかくためくらいであれば、都度tomlを作りこむ必要もないので、対話せずにデフォルトのファイルを作ってもらうのが以下
poetry init --no-interaction
とりあえずapp.pyを作成
from flask import Flask
app = Flask(__name__)
@app.route("/")
def hello():
return "Hello Flask!!"
if __name__ == "__main__":
app.run()
# poetry 2.0以降はshellがデフォルトでは使えないとのことで追加
poetry self add poetry-plugin-shell
# shellに入る
poetry shell
# 実行
python app.py
実行すると http://127.0.0.1:5000 として実行される
止めたければ Ctrl + C
shell からぬけるには、 exit か Ctrl+D
shellを使わないのであれば
poetry run python app.pyで実行(都度poetry run をつける)
あらためてapp.pyを読んでみる
from flask import Flask
app = Flask(__name__)
@app.route("/")
def hello():
return "Hello Flask!!"
if __name__ == "__main__":
app.run()
from flask import Flask
flaskパッケージのFlaskクラスを使用する
参考…importしたものが何なのか調べたければ print(type(Flask)) みたいに書いて出力させれば・・・
<class 'type'> このような出力が得られるます
app = Flask(__name__)
テンプレート、静的ファイルなどのリソースを探す場所をFlaskに教えるもの
@app.route("/")
関数の前につけることで、このルートを指定されたら実行してくださいという指示をしています
デコレータと呼ぶらしい。
C# Asp.netだと関数の前にRouteのアノテーションを指定した場合と一緒ですね
[Route("/")]
public IActionResult hello(){
}
if __name__ == "__main__":
app.run()
開発サーバーでflaskアプリを起動
本番であれば、本稼働用のWSGIサーバーを使用することになるが、これをかいておくのも一つの手
debugモード(エラーがあった場合画面で表示)で実行するなら
if __name__ == "__main__":
app.run(debug=True)
起動方法
shellに移動し、python app.py で実行したが
shellに移動せずに、poetry run python app.pyでもよいし
poetry fun flask run のようにflask runで実行でもよい
補足・・・flask runの場合以下は不要
if __name__ == '__main__':
app.run()
flask runの場合、ターミナルのカレントにあるソースに起点が存在していないと見つけられないといわれてしまう
つまり、静的ファイルやら他のものもあり、ソースをフォルダ階層で分けた場合の話
apps/app.py のように分けましたとなるとルート階層でflask run と書いても実行されない。
poetry run python apps\app.py のように明示的にパスを含めて実行するか
フォルダを移動し、appsに入ってから poetry run flask run とするか
環境変数 FLASK_APP にアプリの場所を設定し
それをもとに実行してもらう
$env:FLASK_APP = ".\apps\app.py"
powershellならこんな感じ。セッション中のみ有効な環境変数設定なのでターミナル抜ければ消えます
これがあれば poetry run flask run でも実行できます
ちなみに、 FLASK_ENVにdevelopmentを指定しておけば、デバッグモードとして実行になる
$env:FLASK_ENV = "development"
ホットリロード
DEVELOPMENTだとホットリロードが有効だと思っていたのだけど
flask runの起動時のログをみると
* Debug mode: off
WARNING: This is a development server. Do not use it in a production deployment. Use a production WSGI server instead.
* Running on http://127.0.0.1:5000
Debug modeのon offと Develomentはまた別物とのこと。
FLASK_ENVにdevelopmentを指定するとその両方が切り替わるはずだが・・・
生成AIの見解。
Flask 2.3 からは FLASK_ENV の使用は非推奨 になっています。
代わりに:
flask --app apps.app --debug run
とのこと
最終的に…
いろんなことを考慮していくと、楽に起動できるということと起動方法の選択しを広げた感じにするなら・・・
こんな手順でしょうか
# プロジェクト作成
mkdir sample
cd sample
#ここでは3.9.7をつかうとする
pyenv local 3.9.7
poetry init --no-interaction
poetry add flask
# フォルダ分けしたくなった場合を考慮していったんフォルダに入れた場合でも実行できることを考えてみる
mkdir apps
.\apps\app.py
from flask import Flask
app = Flask(__name__)
@app.route("/")
def index():
return "Hello, Flask!"
if __name__ == '__main__':
# これは開発サーバー専用。デプロイ時は使われないので記載してあっても問題なし
app.run(debug=True)
# shellが楽なので使いたい
poetry self add poetry-plugin-shell
poetry shell
flask --app apps.app --debug run
flask run じゃなくとも python .\apps\app.pyでも動く
リンク
公式サイト
https://flask.palletsprojects.com/en/stable/
有志による日本語訳サイト
https://msiz07-flask-docs-ja.readthedocs.io/ja/latest/
ソースが気になる場合
flaskがきになる・・となった場合
公式のGitHubを見に行くか
https://github.com/pallets/flask
flaskのクラスであれば
https://github.com/pallets/flask/blob/main/src/flask/app.py
poetryでローカルにインストールしたソースをみるのであれば・・・
poetry env info --path でローカルのパスを調べて
Libフォルダ内にあるflaskの中を見に行く