【问题标题】:How to not use __init__.py as Flask app name?如何不使用 __init__.py 作为 Flask 应用程序名称?
【发布时间】:2017-06-04 04:16:28
【问题描述】:

我有一个这样的烧瓶应用程序:

  • repo_root
    • config.py
    • requirements.txt
    • my_cool_app/
    • my_cool_app/__init__.py
    • my_cool_app/models.py
    • my_cool_app/views.py
    • my_cool_app/static/
    • my_cool_app/templates/

my_cool_app/__init__.py 的内容如下:

from flask import Flask
from flask_sqlalchemy import SQLAlchemy
from flask_migrate import Migrate
from flask_oauth2_login import GoogleLogin
from flask_login import LoginManager

app = Flask(__name__)
app.config.from_object('config')
db = SQLAlchemy(app)
migrate = Migrate(app, db)

google_login = GoogleLogin(app)
login_manager = LoginManager()
login_manager.init_app(app)

import my_cool_app.models
import my_cool_app.views

为了运行它,我调用:

FLASK_APP=my_cool_app/__init__.py flask run

根据网上的各种文档,我想我应该可以将FLASK_APP设置为包名my_cool_app。当我这样做并调用flask run 时,应用程序启动但在浏览器中我立即看到错误:

flask.cli.NoAppException
flask.cli.NoAppException: The file/path provided (my_cool_app) does not appear to exist.  Please verify the path is correct.  If app is not on PYTHONPATH, ensure the extension is .py

我应该怎么做才能将FLASK_APP 设置为my_cool_app?或者考虑到这个烧瓶应用程序的结构方式,将FLASK_APP 设置为其他值是否更合适/更典型?

【问题讨论】:

  • 执行 export FLASK_APP=my_cool_app 烧瓶运行时你在哪个目录?你在你的 repo_root 目录吗?
  • 一般__init__.py 是放置初始化包所需代码的好地方。这不是放置应用程序代码的好地方。

标签: python flask


【解决方案1】:

根据围绕this issue的讨论,似乎确实可以设置FLASK_APP=my_cool_app并使用python -m flask run成功运行。尚不确定这对生产配置有何影响。

【讨论】:

  • 这样做会导致警告 /Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/runpy.py:125: RuntimeWarning: 'flask.cli' found in sys.modules在导入包“flask”之后,但在执行“flask.cli”之前;这可能会导致不可预测的行为
【解决方案2】:

您的 my_cool_app 模块似乎没有在您的 python 路径中被拾取。如果不是,您还需要设置 PYTHONPATH 变量。

假设你在执行命令时在 repo_root 目录下,你应该可以使用:

FLASK_APP=my_cool_app PYTHONPATH=. flask run

如果你想从任何地方运行它,那么:

FLASK_APP=my_cool_app PYTHONPATH=/path/to/repo flask run

【讨论】:

  • 谢谢。但如果可能的话,我想避免更改 PYTHONPATH 以遵守更好的做法。见github.com/pallets/flask/issues/1847
  • 看来python -m flask run 可能是要走的路。
【解决方案3】:

确保您的 views.py 和 model.py 中有“循环”导入。所以在顶部你应该有这样的一行

from my_cool_app import app

总体而言,应用程序的结构看起来非常好,并且遵循了 Flask 为大型应用程序推荐的内容。欲了解更多信息,请尝试点击此链接http://flask.pocoo.org/docs/1.0/patterns/packages/。他们似乎有一个与您的应用程序结构相似的示例,并指导您了解如何导出所有环境变量并让程序包运行。

【讨论】:

    猜你喜欢
    • 2011-11-18
    • 2019-09-10
    • 1970-01-01
    • 2011-01-22
    • 2021-09-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多