Flaskでinstanceフォルダが認識されない場合の対処方法

virtualenvの環境でFlaskinstanceフォルダがうまく認識されなかった時の対処方法

状況

環境としては、IDEにPyCharmを利用。Pythonはvirtualenvの仮想環境を利用

Project
  - main.py
  - instance
    - app.cfg

みたいな感じのフォルダ構成で

app = Flask(__name__, instance_relative_config=True)
app.config.from_pyfile('app.cfg')

とすると、正しくはinstanceフォルダ内のapp.cfgの設定が読み込まれるはずだが、 このファイルが見つからないとエラーになっていた

instance_pathで絶対パスを指定すると正しく読み込まれるが、 Bluemixで使う実装なので絶対パスは使いたくなかった

で、デバッガでパスを見ると、PyCharm.appの中のbinが指定されていた・・・

原因

結論から言うと、フォルダ構成が

Project
  - main.py
  - instance
    - app.cfg
  - venv        # <-ここがNG

となっていたのが原因。どうやらプロジェクト直下にvenvがあると、正しく認識してくれないらしい (詳細は参考リンクを参照)

特にPyCharmの場合だとデフォルトで新しい仮想環境をプロジェクト直下に作ってくれるのでハマってしまった・・・

対処方法

仮想環境をプロジェクト直下ではなく別のフォルダに構築する。今回だと

Project
    - main.py
    - instance
        - app.cfg
venv

という様にProject直下ではないところに仮想環境を構築したら改善した

PyCharmでの修正手順

  1. 既存の仮想環境を削除
    1. Preferences - Project: - Project Interpreterを開く
    2. Project Interpreterの右端にある「歯車」アイコン - Show All...を開く
    3. 現在のプロジェクトのものを選択し、左下の「ー」で削除
  2. 新しい仮想環境を作成
    1. 左下の「+」 - Add Localを開く
    2. Virtualenv Environment - New environmentにチェック
    3. Locationにプロジェクト直下以外を選択して作成(他は任意に選択)
  3. Project Interpreterのリストボックスに2で作った仮想環境が出てくる様になるので選択
  4. 設定画面を閉じるとモジュールのインストールの確認画面が出てくるのでインストールする
  5. 実行時の設定を変更
    1. メニューのRun - Edit Configurationsを選択
    2. Working directoryにプロジェクトのフォルダ位置を指定する

参考リンク