设置 Flask 以对每个环境进行单独配置时不存在的路径

mar*_*nuy 3 python environment-variables python-import flask

我为每个环境和一个应用程序分开了配置,目录树如下所示:

myapp
??? __init__.py         # empty
??? config
?   ??? __init__.py     # empty
?   ??? development.py
?   ??? default.py
?   ??? production.py
??? instance
?   ??? config.py
??? myapp
   ??? __init__.py
   ??? myapp.py
Run Code Online (Sandbox Code Playgroud)

代码

相关代码,myapp/__init__.py

from flask import Flask

app = Flask(__name__, instance_relative_config=True)
app.config.from_object('config.default')
app.config.from_pyfile('config.py')
app.config.from_envvar('APP_CONFIG_FILE')
Run Code Online (Sandbox Code Playgroud)

myapp/myapp.py

from myapp import app
# ...
Run Code Online (Sandbox Code Playgroud)

命令

然后我设置变量:

$export FLASK_APP=myapp.py
Run Code Online (Sandbox Code Playgroud)

并尝试从项目根目录运行开发服务器:

$ flask run
Usage: flask run [OPTIONS]

Error: The file/path provided (myapp.py) does not appear to exist.  Please verify the path is correct.  If app is not on PYTHONPATH, ensure the extension is .py
Run Code Online (Sandbox Code Playgroud)

从项目myapp文件夹中:

$ cd myapp
$ flask run
Usage: flask run [OPTIONS]

Error: The file/path provided (myapp.myapp.myapp) does not appear to exist.  Please verify the path is correct.  If app is not on PYTHONPATH, ensure the extension is .py
Run Code Online (Sandbox Code Playgroud)

使用另一个FLASK_APP变量:

$ export FLASK_APP=myapp/myapp.py
# in project root
$ flask run
Usage: flask run [OPTIONS]

Error: The file/path provided (myapp.myapp.myapp) does not appear to exist.  Please verify the path is correct.  If app is not on PYTHONPATH, ensure the extension is .py
# moving to project/myapp
$ cd myapp
$ flask run
Usage: flask run [OPTIONS]

Error: The file/path provided (myapp/myapp.py) does not appear to exist.  Please verify the path is correct.  If app is not on PYTHONPATH, ensure the extension is .py
Run Code Online (Sandbox Code Playgroud)

其他测试不成功

$ python -c 'import myapp; print(myapp)'
Traceback (most recent call last):
  File "<string>", line 1, in <module>
  File "/home/user/myapp/myapp/__init__.py", line 6, in <module>
    app.config.from_envvar('APP_CONFIG_FILE')
  File "/home/user/.virtualenvs/myapp/lib/python3.5/site-packages/flask/config.py", line 108, in from_envvar
    variable_name)
RuntimeError: The environment variable 'APP_CONFIG_FILE' is not set and as such configuration could not be loaded.  Set this variable and make it point to a configuration file

$ export APP_CONFIG_FILE="/home/user/myapp/config/development.py"
$ python -c 'import myapp; print(myapp)'<module 'myapp' from '/home/user/myapp/myapp/__init__.py'>
$ flask run
Usage: flask run [OPTIONS]
Error: The file/path provided (myapp.myapp) does not appear to exist.  Please verify the path is correct.  If app is not on PYTHONPATH, ensure the extension is .py
Run Code Online (Sandbox Code Playgroud)

笔记:

mar*_*nuy 6

我花了一段时间,但我终于找到了:

  1. Flask 不喜欢__init__.py根级别为 delete 的项目myapp/__init__.py。这是位于根文件夹中的那个:

    myapp
    ??? __init__.py     <--- DELETE
    ...
    ??? myapp
        ??? __init__.py  <--- keep
        ??? myapp.py
    
    Run Code Online (Sandbox Code Playgroud)
  2. $ export FLASK_APP=myapp/myapp.py

  3. 指定配置的环境变量应该是的绝对路径export APP_CONFIG_FILE="/home/user/myapp/config/development.py"

现在一切正常 \o/

$ flask run
* Serving Flask app "myapp.myapp"
* Running on http://127.0.0.1:5000/ (Press CTRL+C to quit)

$ flask shell
Python 3.5.2+ (default, Sep 22 2016, 12:18:14) 
[GCC 6.2.0 20160927] on linux
App: myapp
Instance: /home/user/myapp/instance
>>> 
Run Code Online (Sandbox Code Playgroud)