【问题标题】:How Gunicorn forward request to flaskGunicorn 如何将请求转发到烧瓶
【发布时间】:2016-03-07 14:02:39
【问题描述】:

谁能描述Gunicorn如何将请求转发给Flaskinternally的过程?

如果有人解释从接收 Gunicorn 的请求到将其转发到 Flask 以及相反的方式所涉及的每个步骤,那就太好了。

在说明我是这个领域的新手时,请记住。

【问题讨论】:

    标签: python flask gunicorn


    【解决方案1】:

    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 等信息,然后用它调用应用程序(一个 Flask 对象!) : app(environ, start_repsonse) source, start_repsonse 是 Gunicorn 中获取响应状态和响应头的回调,app 调用的返回值将作为响应体发送。

    【讨论】:

    • 调用 app.run() 和使用 Gunicorn 调用烧瓶应用有什么区别?
    • app.run() 将使用flask内置的wsgi服务器运行应用程序,该服务器用于开发目的,在高负载下性能不佳。而 gunicorn 针对性能进行了高度优化
    • gunicorn python_file:app 将告诉 gunicorn 加载应用程序的位置。这是什么意思?你能再解释一下吗?
    • 你可以把它当成是独角兽表演from python_file import app
    • 如果我们用 2 个 worker 和 4 个线程运行 Gunicorn 会发生什么?每个线程会有单独的应用实例吗?
    猜你喜欢
    • 2014-07-23
    • 1970-01-01
    • 2018-04-05
    • 2021-12-30
    • 2022-01-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多