web-dev-qa-db-fra.com

Un serveur WSGI et un serveur HTTP sont-ils nécessaires pour servir une application Flask?

La configuration de Flask avec uWSGI et Nginx est assez difficile, et même avec des scripts de construction, cela prend un certain temps et doit être enregistré selon des instructions pour être reproduit plus tard.

Si je ne prévois pas une grosse charge sur le serveur (il est caché au public), est-il judicieux de l'exécuter sans uWSGI? (Flask peut écouter un port. Nginx peut-il simplement transmettre des requêtes?)

Est-il judicieux de ne pas utiliser même Nginx, en exécutant simplement l'application flask sur un port?

19
culebrón

Lorsque vous "exécutez Flask", vous exécutez en fait le serveur WSGI de développement de Werkzeug et passez votre application Flask comme appelable WSGI).

Le serveur de développement n'est pas destiné à être utilisé en production. Il n'est pas conçu pour être particulièrement efficace, stable ou sécurisé.

Remplacez le serveur de développement Werkzeug par un serveur WSGI prêt pour la production tel que Gunicorn ou uWSGI lors du passage à la production, peu importe où l'application sera disponible.


La réponse est similaire pour "dois-je utiliser un serveur Web". Les serveurs WSGI possèdent des serveurs HTTP mais ils ne seront pas aussi performants qu'un serveur HTTP de production dédié (Nginx, Apache, etc.).


Flask documents comment déployer de différentes manières. De nombreux hébergeurs ont également de la documentation sur le déploiement de Python ou Flask.

21
davidism

Vraisemblablement, vous avez déjà un Flask objet d'application et itinéraires configurés, mais si vous créez l'application comme ceci:

import flask

app = flask.Flask(__name__)

puis configurez votre @app.route() s, puis lorsque vous souhaitez démarrer l'application:

import gevent

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

Ensuite, vous pouvez simplement exécuter votre application directement plutôt que d'avoir à dire à gunicorn ou uWSGI ou quoi que ce soit d'autre de l'exécuter pour vous.

J'ai eu un cas où je voulais l'utilitaire de flask pour construire une application web (un REST API)) et j'ai trouvé l'impossibilité de composer flask avec d'autres éléments non-flask, non-web-service un problème. J'ai finalement trouvé gevent.wsgi.WSGIServer et c'était exactement ce dont j'avais besoin. Après l'appel à app_server.serve_forever(), vous pouvez appeler app_server.stop() lorsque votre application souhaite quitter.

Dans mon déploiement, mon application écoute sur localhost: en utilisant flask et gevent, puis j'ai des requêtes HTTPS de proxy inverse nginx sur un autre port et les transmets à mon flask service sur localhost.

10
Stephen J.