Flaskの本番稼働について考える

Flask

この記事ではFlaskで作成したアプリケーションをデプロイする方法を記述していきます。

記事を作成するにあたり
Flaskの公式ドキュメントの日本語訳(非公式)を参考にしました。

flaskとは?

めっちゃ軽量なPythonのWebアプリケーションのFWだよ!
Flask Documentation (2.0.x)
↑実は公式ドキュメントではない日本語訳

1. 力技でデプロイする方法(非推奨)

flask run について

最小単位のアプリケーションを実行する際に、flask runコマンドを使用します。

$ export FLASK_APP=hello
$ flask run
 * Running on http://127.0.0.1:5000/

公式ドキュメントを参照すると

This launches a very simple builtin server, which is good enough for testing but probably not what you want to use in production. For deployment options see Deploying to Production.
引用: https://flask.palletsprojects.com/en/2.1.x/quickstart/

意訳: このローンチ方法は、テストには十分だけど本番適用には適していないから
本番適用するなら「Deploying to Production」を見てリリースしろ

とあります。

環境変数「FLASK_APP」について

そのときの作業ディレクトリ(current working directory)を設定するパスと、Pythonファイルまたはdotを使って示されたimportパス(dotted import path)と、必須ではない、インスタンスまたはfactoryの変数名です。
(中略)
もしFLASK_APPが設定されていない場合、flaskコマンドは「app」または「wsgi」を(「.py」ファイルとして、またはパッケージとして)importしようとし、そしてアプリケーションのインスタンスまたはfactoryを見つけ出そうとします。
引用: https://msiz07-flask-docs-ja.readthedocs.io/ja/latest/cli.html

作成するアプリケーションの名前をapp.pyまたはwsgi.pyにして、該当ディレクトリに移動
その状態でflask runを実行するのが一番てっとり早いです。

flask runで本番適用

本来は本番適用に使用するべきではありませんが、下記のコマンドでローンチ可能です。

export FLASK_APP={実行ファイルのフルパス指定}
nohup flask run --host=0.0.0.0 --port={ポートの指定があればそのポート} &>/dev/null

飽くまで非推奨です。
どうしても時間がない場合には参考にしてください。

2. ちゃんとデプロイする(推奨)

時間がきちんとある人はこちらを採用してください。

開発環境での手順

Waitressのインストール

Waitressとは、
WSGI(Web Server Gateway Interface)サーバです。
WSGIとは、Pythonで作成されたWebアプリケーションとWebサーバを接続するためのIFです。

要は、Waitressを使用すればPythonのアプリケーションを公開することができるようです。

pip install waitress

でvenvにインストールします。

Waitressを使用したサーバの稼働方法

from waitress import serve
でライブラリをimportして、
app.run()ではなくserve()でサーバ稼働処理を実行します。

from flask import Flask
from waitress import serve

app = Flask(<strong>name</strong>)

@app.route("/")
def hello():
    return "Hello World"

if <strong>name</strong> == "<strong>main</strong>":
    serve(app, host=<em>!</em>!<em>039;0.0.0.0</em>!_!_039;, port=5000)

ライブラリの書き出し

公式ドキュメントにwheelのインストールとか色々書いてありましたが、よくわからなかったのですっ飛ばします。

wheelの代わりにfreezeを使います。

# 仮想環境に使用されているライブラリの書き出し
pip freeze > requirements.txt

本番環境へのdeploy

コピーするなり、gitを経由するなりして
本番環境にファイルを持ってきたら、
下記の手順でdeployが可能です。

pip install -r requirements.txt
nohup python serve.py &>/dev/null

必要に応じて、ログファイルの書き出し等を行ってください。

最後投げやりになりましたが以上です。

コメント

タイトルとURLをコピーしました