manage.py 是 organize/write Flask 应用程序的正确方法吗?

Is manage.py the proper way to organize/write Flask apps?

首先让我说我觉得问这个问题很傻,因为我找不到前段时间阅读的 thread/article 提供不使用 manage.py 的理由。

我最近启动了一个网络应用程序,但我 真的 很难从 manage.py runserver 格式转换为 gunicorn app:app 格式。我做错什么了吗?这应该是一件轻而易举的事情吗?这是完成的方式吗?

我想我真正想问的是:关于 manage.py runserver 等,编写应用程序然后将其设置为使用 gunicorn 进行部署的正确方法是什么?

如果有人对我的问题感到困惑,请问我,因为我真的很想知道这个问题的答案,因为我正计划在不久的将来构建另一个应用程序。提前致谢!

manage.py 是 web 框架中的一个常见概念。它用于 运行 命令和启动开发服务器。 Flask-Script 扩展为 Flask 提供了这个功能。

最简单的 "management" 脚本只是简单地导入应用程序实例(或从工厂创建一个实例并 运行 发送它,或者 运行 在应用程序上下文中发送另一个命令。

from my_app import app
app.run()
# or for custom commands
with app.app_context():
    do_command()

Flask-Script 做的更多,但最终归结为那个。现在应该很明显 gunicorn my_app:app 正在做同样的事情。 gunicorn 不是 运行 开发服务器,而是生产应用程序服务器,使用与开发服务器相同的应用程序实例。

此答案适用于 Django 和 Flask(以及所有其他 Python wsgi 框架,AFAIK):

像 Flask 和 Django 这样的应用程序带有一个轻量级的内置网络服务器,可以在您进行开发时为您提供帮助。它们是功能齐全的 HTTP 服务器,理论上您 可以 在生产中使用。但是你不应该

您不应该这样做的原因是这些服务器往往非常基本、单线程且非常简单。从开发的角度来看,这是一件好事,因为您不必担心安装这个、那个和另一个。此外,他们可能会做一些漂亮的事情,例如在您进行更改时为您重新加载应用程序。

但他们只希望一个用户一次触摸该页面。你,开发者。

这不是您在生产中想要的。

在生产中,您需要一个能够通过线程(但 probably not)或反应器模式每秒处理数千个请求的 Web 服务器。当您处理长运行 查询或文件上传时,您不希望您的网络服务器停止响应其他请求。这就是像 Gunicorn 或 Tornado 这样的服务器的用武之地——它们允许同时发生大量连接,并且它们能够处理 Django/Flask/Bottle/CherryPy/etc 之间的通信。应用程序和整个互联网。这是好事。

这个过程应该是一个复杂的从内置 wsgi 服务器和 gunicorn/tornado 或任何其他可以 运行 wsgi 交换的过程应用。这就是 wsgi 层的重点。

如果转换出现问题,要么是您的理解有问题,要么是您的应用程序配置错误。这两个都是 SO 社区可以帮助解决的问题,并且可能有一些问题已经解决了大多数更常见的场景。