工作と競馬2

電子工作、プログラミング、木工といった工作の記録記事、競馬に関する考察記事を掲載するブログ

FlaskアプリをApache2で動かしたときの挙動を確認(スクリプト内(.py)のモジュールレベル変数について)

概要

FlaskアプリをApache2で動かしたとき、Flaskアプリスクリプト内モジュールレベル変数は、ずっと保持されることを確認できた。


背景と目的

FlaskアプリをFlaskの開発用サーバ(localhost:5000)で動かしたときは、Flaskアプリを構成しているPythonスクリプトが実行されたままになるため、スクリプト内のモジュールレベル変数は、当然ながら何度アクセスしても同じものが保持される。一方、Apache2で、Webアプリケーションフレームワークを使わずに、単純なCGIスクリプトを動かしたときは、アクセスするたびにスクリプトが呼ばれるため、モジュールレベル変数は呼ばれるたびに作成され実行終了時に破棄される。
では、FlaskアプリをApache2上で動かすと、モジュールレベル変数が保持されるのか、あるいはアクセスされるたびに新しく作成されるのか、という点が気になった。Apache2にデプロイしても開発用と同じ挙動になるのだろうとは思ってはいるが、一応試してみる。


詳細

参考

www.wanna-continue.com


0.実施条件


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アプリスクリプト内モジュールレベル変数は、ずっと保持されることを確認できた。