2016-03-07 124 views
5

任何人都可以描述Gunicorn如何将请求转发给FlaskinternallyGunicorn如何向瓶子发送请求

如果有人解释从接收Gunicorn的请求到将其转发给Flask和相反方法的过程中涉及的每个步骤,这将是非常好的。

在解释我是这方面的新手时请记住。

回答

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解析它,构造一个字典environ,其定义here,包含信息,如REQUEST_METHODQUERY_STRING等,然后调用应用程序(瓶对象!)它:app(environ, start_repsonse)sourcestart_repsonse是Gunicorn回调拿到效应初探状态和标题,和返回值app调用将作为响应主体发送。

+0

使用Gunicorn调用app.run()和调用flask应用程序有什么区别? – neel

+0

'app.run()'将使用内置的烧瓶wsgi服务器来运行应用程序,这是用于开发目的,并且在高负载下性能较差。而gunicorn对性能进行了高度优化 – wong2

+0

gunicorn python_file:应用程序会告诉gunicorn到何处加载您的应用程序。这是什么意思?你能稍微解释一下吗? – neel