概要
FlaskアプリをApache2で動かしたとき、Flaskアプリスクリプト内モジュールレベル変数は、ずっと保持されることを確認できた。
背景と目的
FlaskアプリをFlaskの開発用サーバ(localhost:5000)で動かしたときは、Flaskアプリを構成しているPythonスクリプトが実行されたままになるため、スクリプト内のモジュールレベル変数は、当然ながら何度アクセスしても同じものが保持される。一方、Apache2で、Webアプリケーションフレームワークを使わずに、単純なCGIスクリプトを動かしたときは、アクセスするたびにスクリプトが呼ばれるため、モジュールレベル変数は呼ばれるたびに作成され実行終了時に破棄される。
では、FlaskアプリをApache2上で動かすと、モジュールレベル変数が保持されるのか、あるいはアクセスされるたびに新しく作成されるのか、という点が気になった。Apache2にデプロイしても開発用と同じ挙動になるのだろうとは思ってはいるが、一応試してみる。
詳細
参考
0.実施条件
- Raspberry Pi
- Linux raspberrypi 4.19.66-v7+ #1253 SMP Thu Aug 15 11:49:46 BST 2019 armv7l GNU/Linux
- apache2 2.4.25(Raspbian)
1.準備
本筋とは関係ないが、手順としてメモ。
# 関連パッケージインストール pip3 install flask apt-get install apache2-dev pip3 install mod_wsgi pip3 install mod-wsgi-httpd # 作業用ディレクトリ作成 mkdir Apache2+Flask cd Apache2+Flask sudo mkdir /var/www/flask # テスト用ディレクトリ
1.作成
Flaskアプリ
モジュールレベル変数として、dtというものを作成。
# coding: utf-8 from flask import Flask import datetime app = Flask(__name__) # モジュールレベル変数 dt = datetime.datetime.now().strftime("%H:%M:%S") @app.route("/") def hello(): return "Hello, Flask!" + dt if __name__ == "__main__": app.run()
adapter.wsgi
# coding: utf-8 import sys sys.path.insert(0, '/var/www/flask') from app import app as application
flask.conf
<VirtualHost *:80> ServerName 192.168.2.167:80 LoadModule wsgi_module /home/pi/.local/lib/python3.5/site-packages/mod_wsgi/server/mod_wsgi-py35.cpython-35m-arm-linux-gnueabihf.so DocumentRoot /var/www/flask WSGIDaemonProcess test user=pi group=pi threads=5 WSGIScriptAlias / /var/www/flask/adapter.wsgi <Directory "/var/www/flask/"> WSGIProcessGroup test WSGIApplicationGroup %{GLOBAL} WSGIScriptReloading On Require all granted </Directory> </VirtualHost>
2.デプロイ
sudo cp app.py /var/www/flask sudo cp adapter.wsgi /var/www/flask sudo cp flask.conf /etc/apache2/conf-available/ sudo ln -s /etc/apache2/conf-available/flask.conf /etc/apache2/conf-enabled
3.動作確認
以下のようになり、apache2が立ち上がっている間ずっと、dtの値は変わらず18:10:09となった。つまり、モジュールレベル変数はずっと保持されている。
Hello, Flask!18:10:09
まとめと今後の課題
FlaskアプリをApache2で動かしたとき、Flaskアプリスクリプト内モジュールレベル変数は、ずっと保持されることを確認できた。