2016-03-07 4 views
5

Kann jemand den Prozess beschreiben, wie Gunicorn die Anfrage an Flaskinternally weiterleiten?Wie Gunicorn Forward Anfrage an Kolben

Es wäre großartig, wenn jemand jeden einzelnen Schritt im Prozess von der Anfrage von Gunicorn bis zur Weiterleitung an Flask und umgekehrt erklärt.

Bitte beachten Sie, dass ich ein Newbee in diesem Bereich bin.

Antwort

9

Gunicorn und Flask spricht durch WSGI, die zwei Seiten hat: Server-Seite und die Anwendungsseite.

über die Anwendung (Gerüst) Seite brauchen wir eine aufrufbar zu schaffen, das einfachste Beispiel:

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

der Server diese Anwendung aufrufen und Umgebungsinformationen und eine Callback-Funktion bereitstellt, die Start, um anzuzeigen, verwendet wird, einer Antwort. Wenn der Server die Antwort erhält, wird sie an den Browser zurückgegeben.

so, für gunicorn und Kolben:

from flask import Flask 
app = Flask(__name__) 

wenn Sie dies tun, haben Sie eigentlich eine WSGI kompatible Anwendung kam, ist app eine aufrufbare:

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) 

und beim Ausführen von gunicorn app:app , Sie sagen Gunicorn, wo Sie Ihre Anwendung laden, source

Wenn eine Anfrage kommt, analysiert Gunicorn es, ein Diktat 012 zu konstruieren, die here definiert ist, Informationen wie REQUEST_METHOD enthält, QUERY_STRING etc, dann die Anwendung aufrufen (a Flask Objekt!) Mit sich: app(environ, start_repsonse)source, start_repsonse ist ein Rückruf in Gunicorn den reponse Status und Header zu bekommen, und den Rückgabewert Der Anruf app wird als Antworttext gesendet.

+0

Was ist der Unterschied zwischen dem Aufruf von app.run() und dem Aufruf von flask-Anwendungen mit Gunicorn? – neel

+0

'app.run()' wird die App mit dem eingebauten wsgi-Server von flask ausführen, der für Entwicklungszwecke gedacht ist und unter hoher Last schlecht funktioniert. während Gunicorn in hohem Grade für Leistung optimiert wird – wong2

+0

gunicorn python_file: app teilt Gunicorn mit, wo man deine Anwendung lädt. Was heißt das? Kannst du es etwas weiter erklären? – neel