Servidor de desarrollo

Flask proporciona un comando run para ejecutar la aplicación con un servidor de desarrollo. En el modo de desarrollo, este servidor proporciona un depurador interactivo y se recargará cuando se cambie el código.

Advertencia

No utilice el servidor de desarrollo cuando lo despliegue en producción. Está pensado para ser utilizado sólo durante el desarrollo local. No está diseñado para ser particularmente eficiente, estable o seguro.

Ver Despliegue en producción para las opciones de despliegue.

Línea de comandos

El script de línea de comandos flask run es la forma recomendada para ejecutar el servidor de desarrollo. Utiliza la opción --app para apuntar a tu aplicación, y la opción --env development para activar completamente el modo de desarrollo.

$ flask --app hello --env development run

Estas opciones (y cualquier otra) también pueden establecerse mediante variables de entorno.

$ export FLASK_APP=hello
$ export FLASK_ENV=development
$ flask run

Esto habilita el entorno de desarrollo, incluyendo el depurador interactivo y el recargador, y luego inicia el servidor en http://localhost:5000/. Utilice flask run --help para ver las opciones disponibles, y Interfaz de línea de comandos para obtener instrucciones detalladas sobre la configuración y el uso de la CLI.

Nota

El modo de depuración se puede controlar por separado del entorno de desarrollo con la opción --debug/--no-debug o la variable de entorno FLASK_DEBUG. Así es como funcionaban las versiones anteriores de Flask. Es preferible configurar el entorno de desarrollo como se muestra arriba.

Dirección ya utilizada

Si otro programa ya está utilizando el puerto 5000, verá un OSError cuando el servidor intente iniciarse. Puede tener uno de los siguientes mensajes:

  • OSError: [Errno 98] Address already in use

  • OSError: [WinError 10013] An attempt was made to access a socket in a way forbidden by its access permissions

Identifique y detenga el otro programa, o utilice flask run --port 5001 para elegir un puerto diferente.

Puedes usar netstat o lsof para identificar qué id de proceso está usando un puerto, y luego usar otras herramientas del sistema operativo para detener ese proceso. El siguiente ejemplo muestra que el proceso 6847 está usando el puerto 5000.

$ netstat -nlp | grep 5000
tcp 0 0 127.0.0.1:5000 0.0.0.0:* LISTEN 6847/python

macOS Monterey y posteriores inician automáticamente un servicio que utiliza el puerto 5000. Para desactivar el servicio, vaya a Preferencias del Sistema, Compartir, y desactive «AirPlay Receiver».

Carga lenta o urgente

Cuando se utiliza el comando flask run con el recargador, el servidor continuará funcionando incluso si se introducen errores de sintaxis u otros errores de inicialización en el código. El acceso al sitio mostrará el depurador interactivo para el error, en lugar de bloquear el servidor. Esta característica se llama carga lenta o «lazy loading».

Si hay un error de sintaxis cuando se llama a flask run, fallará inmediatamente y mostrará el rastro en lugar de esperar hasta que se acceda al sitio. Esto pretende hacer que los errores sean más visibles al principio, al tiempo que permite al servidor manejar los errores en la recarga.

Para anular este comportamiento y fallar siempre inmediatamente, incluso en la recarga, pase la opción --eager-loading. Para mantener siempre el servidor en funcionamiento, incluso en la llamada inicial, pasa --lazy-loading.

En Código

Como alternativa al comando flask run, el servidor de desarrollo también puede iniciarse desde Python con el método Flask.run(). Este método toma argumentos similares a las opciones de la CLI para controlar el servidor. La principal diferencia con el comando CLI es que el servidor se bloqueará si hay errores al recargar.

Se puede pasar debug=True para activar el depurador y el recargador, pero la variable de entorno FLASK_ENV=development sigue siendo necesaria para activar completamente el modo de desarrollo.

Coloque la llamada en un bloque principal, de lo contrario interferirá al intentar importar y ejecutar la aplicación con un servidor de producción más tarde.

if __name__ == "__main__":
    app.run(debug=True)
$ python hello.py