【问题标题】:Launch Flask app factory (with create_app()) from external file从外部文件启动 Flask 应用程序工厂(使用 create_app())
【发布时间】:2021-11-09 11:57:09
【问题描述】:

按照tutorial dockerize Flask 堆栈,我正在尝试从外部 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 的配置导入。我试图用 manage.py 中可见的 chdir 来解决这个问题。

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

FLASK_APP="myserver:create_app()"

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

from myserver.config.config import Config

通过

from .config.config import Config

但整个项目包含以 from myserver

开头的导入

所以最后一个问题是:为什么 myserver 中的 init 文件无法识别 myserver 文件夹/模块?当我通过 PyCharm 启动它时,这个设置工作得很好

【问题讨论】:

  • 我不知道我是否完全遵循您的问题,但是像您一样,相对导入要记住的一点是路径会根据您的工作目录而变化。因此,在一个目录中工作的导入不会在另一个目录中工作。所以一定要相对于 docker 正在运行的任何目录导入。
  • @BrandonKauffman 不会 os.chdir 帮忙吗?
  • 实际上没有。我希望我有一个很好的答案,但我可以只是代码不能与解释器一起工作。 stackoverflow.com/questions/23619595/…
  • 我已经发布了我的答案,引用了这个完全相同的帖子。谢谢你:)

标签: python python-3.x flask python-import


【解决方案1】:

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

尝试将 manage.py 信息添加到 init 文件中。 从网页导入管理

【讨论】:

  • 我不确定你的意思。我应该在初始化文件中导入 manage.py 吗?像这样:from ...manage import *
  • 是的。你可以试试这样做
  • 我试过了,不幸的是没有改变任何东西
【解决方案2】:

Brandons 评论和this answer 引导我找到解决方案

ma​​nage.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 更改它。我现在可以使用我的服务器初始化文件

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-09-26
    • 2014-06-20
    • 1970-01-01
    • 1970-01-01
    • 2017-08-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多