在生产环境中以包的形式运行Flask

11

我正在尝试部署我的Flask应用。通常我会有一个app.py文件并将所有代码放在其中。

app.py
templates/
|
|--index.html

对于我的非常小的项目来说,这很好。但后来我有了一个稍微大一点的应用程序,并按照 Flask 的大型应用程序指南进行操作。所以,我有了这个:

setup.py
app/
    __init__.py
    views.py
    models.py
    forms.py
    templates/
    | ---index.html

我现在已经将所有的路由和视图都放在views.py中,并且在__init__.py中运行应用程序:

from flask import Flask
app = Flask(__name__)
import app.views # Name in setup.py
if __name__ == "__main__":
    app.run()

(这只是一个示例) 现在我按照指南运行它,使用pip install -e .并使用以下方式运行:>set FLASK_APP=app(我在setup.py中设置的名称)flask run,它可以工作。但问题是我不知道如何用一个命令来运行它。由于没有一个文件来运行,我不能使用gunicorn或其他类似的东西。我不确定如何执行此应用程序。我该如何在云服务器heroku上运行pip install .? 我的问题是因为我必须从__init__.py导入app和使用import blog导入视图(例如models、views等)。任何帮助都将不胜感激。谢谢。

编辑:我不想使用蓝图。那可能会太多了。我的应用程序是中等大小,既不小也不大。


1
你是否尝试按照此处详细说明的方法使用 Heroku 的 Procfile 文件? - Luis Orduz
2个回答

9
你完全可以使用Gunicorn来运行这个项目。Gunicorn不仅限于单个文件,它与flask run一样导入Python模块。Gunicorn只需要知道要导入的模块和在该模块中调用的WSGI对象。
当你使用FLASK_APP时,flask run所做的就是查找module.appmodule.applicationFlask()类的实例。它还支持create_app()make_app()应用程序工厂,但你没有使用这样的工厂。
如果你只给出一个模块,Gunicorn不会搜索,它会期望名称为application的WSGI可调用项。在你的情况下,你正在使用app,所以你只需要明确告诉它要使用哪个名称即可。
gunicorn app:app

:之前的部分是要导入的模块(在您的情况下为app),冒号之后的部分是可调用对象(在您的模块中也被命名为app)。
如果您已将FLASK_APP设置为 Heroku配置变量并希望重复使用它,您可以在gunicorn的命令行中引用它。
gunicorn $FLASK_APP:app

-1
关于Heroku,它可以处理requirement.txtsetup.py
参见https://devcenter.heroku.com/articles/python-pip#local-file-backed-distributions

如果您的Python应用程序包含一个setup.py文件但不包括requirements.txt文件,则将使用python setup.py develop来安装您的软件包并解决依赖项。

如果您已经有了一个requirements文件,但想要利用此功能,您可以将以下内容添加到您的requirements文件中:

-e .

关于运行命令,我认为你可以像这样放置Procfile。
web: FLASK_APP=app flask run

或者

web: FLASK_APP=app python -m flask run

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接