manage.py是组织/编写Flask应用程序的正确方法吗?

时间:2015-05-04 03:03:05

标签: python flask gunicorn

首先让我说我觉得这个问题非常愚蠢,因为我找不到前一段时间读过的帖子/文章,提供不使用manage.py的理由。

我最近推出了一个网络应用,我真的努力将manage.py runserver转换为gunicorn app:app格式。我做错什么了吗?这应该是轻而易举的,这就是它的完成方式吗?

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

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

2 个答案:

答案 0 :(得分:3)

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

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

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

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

答案 1 :(得分:1)

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

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

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

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

这不是你想要的。

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

该进程应该从内置的wsgi服务器和gunicorn / tornado或其他任何可以运行wsgi应用程序的东西进行交换。这就是wsgi层的重点。

如果转换有问题,您的理解有问题,或者您的应用程序配置错误。这些都是SO社区可以提供帮助的问题,并且可能有一些问题已经解决了大多数更常见的情况。