2016-08-16 1 views
6

Das Einrichten von Flask mit uWSGI und Nginx ist ziemlich schwierig, und selbst mit Build-Skripten dauert es einige Zeit, und es muss in Anweisungen aufgezeichnet werden, die später reproduziert werden.Sind ein WSGI-Server und HTTP-Server erforderlich, um eine Flask-App zu bedienen?

Wenn ich keine große Last auf dem Server plane (es ist aus der Öffentlichkeit versteckt), macht es Sinn, es ohne uWSGI zu betreiben? (Flask kann auf einen Port hören. Kann Nginx Anfragen einfach weiterleiten?)

Macht es Sinn, nicht einmal Nginx zu benutzen, nur blank flash app auf einem Port laufen zu lassen?

+0

Tornado ist ein sehr leichter Python-Server, ich verwende ihn in meiner Entwicklungsumgebung. Aber du möchtest vielleicht nachsehen. Wenn der Dienst trotzdem ausgeblendet ist, sehe ich kein Problem beim Ausführen des Inbuild-Dev-Servers, aber ich habe während der Entwicklung Verzögerungen festgestellt. Es ist möglicherweise nicht so stabil und ... – Hannes

+3

Verwenden Sie Tornado nicht zum Ausführen von WSGI-Anwendungen. Ihre eigene Dokumentation warnt davor. – davidism

+0

Oh, gut zu wissen. Ich vermute. Hatte aber nie Schwierigkeiten damit. Muss in die Dokumentation schauen ... :) – Hannes

Antwort

7

Wenn Sie "Flask" ausführen, führen Sie den WSGI-Server von Werkzeugentwicklung aus und übergeben Ihre Flask-App als WSGI-Aufruf.

Der Entwicklungsserver ist nicht für die Verwendung in der Produktion vorgesehen. Es ist nicht dafür ausgelegt, besonders effizient, stabil oder sicher zu sein.

Ersetzen Sie den Werkzeug Dev-Server durch einen produktionsbereiten WSGI-Server wie Gunicorn oder uWSGI, wenn Sie in die Produktion gehen, egal wo die App verfügbar ist.


Die Antwort ist ähnlich für "sollte ich einen Webserver verwenden". WSGI-Server haben zwar HTTP-Server, aber sie sind nicht so gut wie ein dedizierter Produktions-HTTP-Server (Nginx, Apache usw.).


Flask documents wie auf verschiedene Weise zu implementieren. Viele Hosting-Anbieter haben auch Dokumentation über die Bereitstellung von Python oder Flask.

1

Vermutlich haben Sie bereits eine Flasche App Objekt und Routen einrichten, aber wenn Sie die App wie folgt zu erstellen:

import flask 

app = flask.Flask(__name__) 

dann @app.route() s einrichten, und dann, wenn Sie die App starten möchten:

import gevent 

app_server = gevent.wsgi.WSGIServer((host, port), app) 
app_server.serve_forever() 

Dann können Sie einfach Ihre Anwendung ausführen direkt, anstatt zu sagen, mit gunicorn oder uwsgi oder irgendetwas anderes es für Sie ausführen.

Ich hatte einen Fall, wo ich das Dienstprogramm von Kolben wollte, um eine Webanwendung (ein REST API-Dienst) zu erstellen und die Unfähigkeit zu finden, Flasche mit anderen non-flask, non-Web-Service-Elementen ein Problem zu komponieren. Ich fand schließlich gevent.wsgi.WSGIServer und es war genau das, was ich brauchte. Nach dem Anruf an app_server.serve_forever() können Sie app_server.stop() aufrufen, wenn Ihre Anwendung beendet werden soll.

In meiner Bereitstellung überwacht meine Anwendung localhost: mit flask und gevent, und dann habe ich HTNPS-Reverse-Proxy-Anfragen auf einem anderen Port und leiten sie an meinen flask-Dienst auf localhost.

+0

Also immer noch einen WSI-Server verwenden? Sie sagen, der gevent Server läuft anders als gunicorn's oder uwsgi's zu laufen, ist es aber nicht. Und Sie können beide dann auch programmatisch ausführen. – davidism

+0

Ich sehe. Ja, gevents WSGIServer ist immer noch ein WSGIServer, aber es ist der einzige, den ich finden konnte, den ich programmgesteuert von meinem Daemon aus ausführen konnte (und der OP beklagte speziell, wie kompliziert das Setup für die Ausführung seiner Flask-App war) unter anderen WSGI-Servern). Ich freue mich zu hören, dass die WSGI-Server von gunicorn und uwsgi auch so betrieben werden können, auch wenn das Auffinden dieser Informationen nicht trivial ist. –

Verwandte Themen