Gunicorn如何向烧瓶提出要求

时间:2016-03-07 14:02:40

标签: python flask gunicorn

有人可以描述Gunicorn将请求转发给Flask internally的过程吗?

如果有人解释过程中涉及的每一步,从接收Gunicorn的请求到将其转发到Flask,反之亦然,这将是很棒的。

在解释我是这个领域的新手时请记住。

1 个答案:

答案 0 :(得分:9)

Gunicorn和Flask通过WSGI进行对话,其中有两个方面:服务器端和应用程序端。

在应用程序(框架)方面,我们需要提供一个可调用的,最简单的例子:

def application(environ, start_response):
    start_response('200 OK', [('Content-Type', 'text/plain')])
    return ['Hello World']

服务器将调用此应用程序并提供环境信息和回调函数,该函数用于指示响应的开始。当服务器获得响应时,它会将其返回给浏览器。

所以,对于gunicorn和烧瓶:

from flask import Flask
app = Flask(__name__)

当你这样做时,你实际上有一个WSGI兼容的应用程序,app是一个可调用的:

class Flask(object):
    ...

    def __call__(self, environ, start_response):
        """Shortcut for :attr:`wsgi_app`."""
        return self.wsgi_app(environ, start_response)

[source](https://github.com/mitsuhiko/flask/blob/master/flask/app.py#L1976)

当您运行gunicorn app:app时,您告诉gunicorn在哪里加载您的应用,source

当请求到来时,gunicorn解析它,构造一个dict environ,其定义为here,包含REQUEST_METHODQUERY_STRING等信息,然后调用应用程序(一个Flask对象!):app(environ, start_repsonse) sourcestart_repsonse是Gunicorn中的一个回调,用于获取响应状态和标题,以及app调用的返回值将作为回复机构发送。