从外部文件启动 Flask 应用程序工厂(使用 create_app())

Launch Flask app factory (with create_app()) from external file

按照此 tutorial 对 Flask 堆栈进行 docker 化,我正在尝试从外部 manage.py 文件

启动现有应用程序

我的应用程序结构如下:

└── services
    └── web
        ├── manage.py
        └── myapp
            └── requirements.txt
            └── myserver
                └──__init__.py
                └──config
                   └──config.py

manage.py 文件:

import os
os.chdir('myapp')
from flask.cli import FlaskGroup
from myapp.myserver import create_app

app = create_app()

cli = FlaskGroup(app)


if __name__ == "__main__":
    cli()

最后,myapp/myserver/__init__.py 文件(简体):

from myserver.config.config import Config # this file exists and imports work when i launch from pycharm 

def create_app():
    app = Flask(__name__)
    ...other stuff here
    return app

所以当我尝试 运行: python3 manage.py run 时,输出为:

  File "manage.py", line 4, in <module>
    from myapp.myserver import create_app
  File "/var/www/html/flask-docker/services/web/myapp/myserver/__init__.py", line 12, in <module>
    from myserver.config.config import Config

无法解析从 __init__.py 导入的配置。我试图用 chdir 中可见的 manage.py.

来解决这个问题

我的环境变量是我从工作 Pycharm flask 设置中得到的:

FLASK_APP="myserver:create_app()"

我通过替换成功地通过了导入指令:

from myserver.config.config import Config

来自

from .config.config import Config

但整个项目包含以 from myserver

开头的导入

所以最后一个问题是:为什么myserver里面的初始化文件不能识别myserver folder/module?当我通过 PyCharm

laucnh 时,此设置工作正常

它找不到模块,因为它不知道要搜索什么目录才能找到文件manage.py。

尝试将 manage.py 信息添加到初始化文件。 从网络导入管理

Brandons 的评论和 让我找到了解决方案

manage.py

import sys
#this is the fix
sys.path.append(os.path.join(os.path.dirname(__file__),'myapp'))
from flask.cli import FlaskGroup
from myapp.myserver import create_app

app = create_app()

cli = FlaskGroup(app)
## Heading ##
if __name__ == "__main__":
    cli()

我没有使用 os.chdir 更改工作目录,而是使用 sys.path 更改它。我现在可以使用我的服务器初始化文件