Flask + SQLAlchemy + WSGIでちょっとはまったメモ

えがおと開発中に、自分のアホさでハマったので自戒をこめてメモ
# いくつか同様のネタがあるのでシリーズ化するかも(´・ω・`)

結論を先に書くと、DB接続セッションはちゃんとクローズしろ(#゚Д゚)ゴルァ!! ってことなんですが

構成

  • Apache + WSGIの構成で、Virtual Hostsによる複数ホストでWSGIdaemon modeで起動
    • 例えばa.hoge.comとb.hoge.comのWSGIアプリを別デーモンとして起動
  • a.hoge.comのFlaskアプリ(Aアプリ)とb.hoge.comのFlaskアプリ(Bアプリ) は同じDBを参照
  • DBの利用はSQLAlchemy(Flask-SQLAlchemy)を利用
    • DB定義のmodelはAアプリ、Bアプリとは別ファイルに記述したものを利用

現象

a.hoge.comで追加・変更したはずのデータがb.hoge.comに反映されない(´・ω・`)なぜ?ちなみにApacheを再起動すると反映される…なん、だ、と…( ゚д゚ )

原因と解決

Flaskの後処理プロセスの中でDBのセッションをクローズしていなかったのが原因みたいで、各アプリのafter_request(viewの後処理用プロセス)でdbのセッションをクローズするとOKだったみたい。

#####
# close db session
@app.after_request
def close_session(response):
    # DBのセッションをクローズ
    db_session.close()
    return response

...というより、マニュアルに書いてあるんだからちゃんとヤレ(#゚Д゚)ゴルァ!!ってことですね、ほんとゴメンナサイ


詳しい原因については、WSGIでセッションが永続化されたせいで、他セッションの変更状態を取得できなかったのが原因?もしやdb_session.commit()ではホントの意味でコミットされない?等という妄想どまできちんと理解出来ていないので、近日中にWSGIとかSQLAlchemyまわりのコードとドキュメント読まなきゃだめだな…と思っております。

あと、他のフレームワークでdbのクローズ処理をサボってもOKだったからといって、全ての環境でサボっていいわけではないのよってことも反省…etc

以上です

マニュアルをちゃんと読めばこんなミスをしないと思いますが、同様の現象でハマった人の一助になればこれ幸い