Flask環境のデバッグ方法
サーバ側はFlaskで構築しましたが、Flaskの本番環境だといまいちエラーがどこででているのかわかりにくく、デバッグに難儀することが見えてきました。
そこで、ローカル環境でテストする方法を確認しました。
ローカル環境の構築
以下の手順でpythonの仮想環境でローカル環境を作ります。
~$ cd python/ ~/python$ python3 -m venv example ~/python$ source ./example/bin/activate (example) ~/python$ cd example/ (example) ~/python/example$ pip install --upgrade pip (example) ~/python/example$ sudo apt install mosquitto-clients ← MQTTを動かす必要がある場合 (example) ~/python/example$ pip install paho-mqtt ← MQTTを動かす必要がある場合 (example) ~/python/example$ pip install Flask (example) ~/python/example$ pip install Flask-HTTPAuth
ソースのコピー
app ディレクトリの下をまるごと持ってきます。まるごとではなく、一部だけ持ってくる場合には、不要な Blueprint の呼び出しをコメントアウトします。
例: #from appA.appA import appA #app.register_blueprint(appA)
なお、MQTTでのデータ引き取りまで含めてローカルでテストする場合には、subscribe を行う関数を以下のようにしておくことで、サーバ環境なのか、リモートのデバッグ環境なのかを切り分けます。
import ssl,socket # デバッグ用 HOSTNAME = 'i-xxxxxxxx' # 本番サーバのホスト名 : : def subscribe(): while True: client = mqtt.Client() client.username_pw_set('ユーザー名', password='パスワード') client.on_connect = on_connect client.on_message = on_message # 環境によって振り分けるためにホスト名を判定する if socket.gethostname() == HOSTNAME : # 本番時 client.connect('localhost', 1883, keepalive=60) else : # デバッグ時 client.tls_set(cert_reqs=ssl.CERT_OPTIONAL,tls_version = ssl.PROTOCOL_TLSv1_2) client.tls_insecure_set(False) client.connect('example.com', 8883, keepalive=60) client.loop_forever()
テスト環境の起動
テスト環境の起動は
(example) ~/python/example/app$ python app.py
として起動します。必要なら、subscribe を行うプログラムを別のシェルを起動してから
(example) ~/python/example/app$ python app_sub.py
として MQTT のsubscribeを行うプログラムも起動します。