2016-03-07 127 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