with framework español applications app python nginx cherrypy flask werkzeug

español - python framework django



Usando CherryPy/Cherryd para lanzar varias instancias de Flask (2)

Según las sugerencias sobre SO / SF y otros sitios, estoy usando CherryPy como el servidor WSGI para iniciar varias instancias de un servidor web Python que construí con Flask. Cada instancia se ejecuta en su propio puerto y se sienta detrás de Nginx. Debo señalar que lo siguiente funciona para mí, pero me preocupa que haya hecho las cosas mal y funciona "por accidente".

Aquí está mi archivo cherrypy.conf actual:

[global] server.socket_host = ''0.0.0.0'' server.socket_port = 8891 request.dispatch: cherrypy.dispatch.MethodDispatcher() tree.mount = {''/'':my_flask_server.app}

Sin bucear demasiado en mi servidor Flask, así es como comienza:

import flask app = flask.Flask(__name__) @app.route(''/'') def hello_world(): return "hello"

Y aquí está el comando que publico en la línea de comando para iniciar con Cherryd:

cherryd -c cherrypy.conf -i my_flask_server

Las preguntas son:

  1. Está envolviendo el frasco dentro de CherryPy sigue siendo el método preferido para usar Flask en producción? https://stackoverflow.com/questions/4884541/cherrypy-vs-flask-werkzeug

  2. ¿Es esta la manera correcta de usar un archivo .conf para iniciar CherryPy e importar la aplicación Flask? Revisé la documentación de CherryPy, pero no encuentro ningún caso de uso que coincida específicamente con lo que intento hacer aquí.

  3. ¿Es la forma correcta de ejecutar múltiples instancias de CherryPy / Flask en una sola máquina para ejecutar múltiples comandos cherryd (demonización con -d, etc.) con archivos .conf únicos para cada puerto que se utilizará (8891, 8892, etc.)? ¿O hay una mejor forma de "CherryPy" para lograr esto?

Gracias por cualquier ayuda y visión.


No puedo hablar por Flask, pero puedo por CherryPy. Parece la "forma correcta" ... principalmente. Esa línea sobre un MethodDispatcher no funciona, ya que solo afecta a las aplicaciones CherryPy, y parece que no has montado ninguna (solo una aplicación Flask en su lugar).

En cuanto al punto 3, lo tienes correcto. CherryPy le permite ejecutar múltiples objetos de servidor en el mismo proceso para escuchar en múltiples puertos (o protocolos), pero no tiene ningún azúcar para iniciar múltiples procesos. Como dices, varios comandos de cherryd con diferentes archivos de configuración es cómo hacerlo (a menos que quieras usar una herramienta de administración de cluster / config más integrada como eggmonster ).


Terminología: Montaje vs injerto

En principio, esta es una forma adecuada de servir una aplicación de matraz a través de cereza, solo una nota rápida sobre su nombre:

Vale la pena señalar que tree.mount no es una clave de configuración en sí misma: tree conducirá a cherrypy._cpconfig._tree_config_handler(k, v) se llama con los argumentos ''mount'', {''/'': my_flask_server.app} .

El parámetro clave no se usa en absoluto por _tree_config_handler por lo que en su configuración "mount" es solo una etiqueta arbitraria para ese dict específico de mapeos de ruta. Tampoco "monta" la aplicación (no es una aplicación CherryPy después de todo). Con esto quiero decir, no hace cherrypy.tree.mount(…) sino que cherrypy.tree.graft es un manejador WSGI arbitrario en su espacio de nombres "script-name" (rutas, pero en terminología CherryPy).

El mensaje de registro de Cherrypy de manera un tanto engañosa dice "Mounted <app as string> on /"]

Este es un punto bastante importante ya que con injerto, a diferencia de montar, no puede especificar más opciones como el servicio de archivos estáticos para su aplicación o las respuestas de transmisión en esa ruta.

Así que recomendaría cambiar la clave de configuración tree.mount a algo descriptivo que no invite a leer demasiada semántica sobre lo que sucede dentro de CherryPy (ya que existe el método cherrypy.tree.mount ) debido a esa configuración. Por ejemplo, tree.flask_app_name si solo está asignando esa aplicación en ese dict (puede haber muchas directivas en tree , todas ellas fusionadas en el espacio de nombres de rutas) o tree.wsgi_delegates si tree.wsgi_delegates muchas aplicaciones en ese dict.

Usando CherryPy para servir contenido adicional sin hacer una aplicación de él

Otra nota al margen, si quieres que cherrypy proporcione, por ejemplo, servicio de archivos estático para tu aplicación, no tienes que crear una aplicación repetitiva para mantener esa configuración. Solo tiene que montar None con la configuración adicional apropiada. Los siguientes archivos serían suficientes para que CherryPy sirva contenido estático del subdirectorio ''static'' si se colocan en el directorio donde se ejecuta cherryd para servir contenido estático (invoque a cherryd como cherryd -c cherrypy.conf -i my_flask_server -i static :

static.py

import cherrypy # next line could also have config as an inline dict, but # file config is often easier to handle cherrypy.tree.mount(None, ''/static-path'', ''static.conf'')

static.conf

# static.conf [/] tools.staticdir.on = True tools.staticdir.root = os.getcwd() tools.staticdir.dir = ''static'' tools.staticdir.index = ''index.html''