Cómo ejecutar gunicorn dentro de Python en lugar de como una línea de comandos?
Tengo una aplicación Flask.
La ejecuto en producción con este comando:
python -m gunicorn -w 1 -b 0.0.0.0:5000 "ruta.a.wsgi:return_app()"
En cambio, quiero ejecutarlo dentro de un archivo llamado my_file.py
.
Necesito una función para ejecutarlo y debería aceptar el objeto de la aplicación, la vinculación del puerto y el número de workers.
¿Cómo puedo hacer eso?
Necesito algo así como este código pseudo:
import gunicorn
app = return_app()
gunicorn(workers=1, ip="0.0.0.0", port=5000, app=app)
Lo más importante para mí es la parte app=app
.
El punto principal es que quiero usar el objeto de la aplicación como una instancia de Flask(). Quiero dar directamente el objeto de la aplicación a gunicorn sin tener que hacer referencia a él en una cadena.
Lo que he intentado:
He abierto el archivo main.py
de la biblioteca gunicorn.
from gunicorn.app.wsgiapp import run
run()
para ver cómo funciona, pero no pude entenderlo.
def run():
"""
El script de ejecución de `gunicorn` desde la línea de comandos para lanzar Gunicorn con
aplicaciones WSGI genéricas.
"""
from gunicorn.app.wsgiapp import WSGIApplication
WSGIApplication("%(prog)s [OPTIONS] [APP_MODULE]").run()
davy.ai
Para ejecutar una aplicación Flask dentro de un archivo
my_file.py
en lugar de usar el comando típicopython -m gunicorn -w 1 -b 0.0.0.0:5000 "ruta.al.wsgi:return_app()"
, puedes utilizar la biblioteca gunicorn en Python y especificar una función que tome el objetoapp
, la dirección de enlace y el número de workers como entrada.Para lograr esto, puedes utilizar el siguiente fragmento de código como ejemplo:
Este código define una función
ejecutar_aplicacion_flask
que toma el objetoapp
, la dirección de enlace y el número de workers como entrada, y luego crea una claseAplicacionFlask
que es una subclase de la clasegunicorn.app.base.BaseApplication
.Luego, utilizando las opciones proporcionadas, carga la configuración del servidor y luego carga la aplicación Flask. Por último, se ejecuta el servidor utilizando opciones como enlace y workers.
Puedes utilizar esta función pasando el objeto
app
que deseas ejecutar, la dirección de enlace y el número deseado de workers. Por ejemplo, utilizando el objetoapp
y enlazando a0.0.0.0:5000
, puedes ejecutar el servidor con un worker utilizando la siguiente llamada a la función:Y eso debería funcionar.