Configure el servidor de desarrollo de Flask para que sea visible en toda la red

442

No estoy seguro de si esto es específico de Flask, pero cuando ejecuto una aplicación en modo dev ( http://localhost:5000), no puedo acceder desde otras máquinas en la red (con http://[dev-host-ip]:5000). Con Rails en modo dev, por ejemplo, funciona bien. No pude encontrar ningún documento sobre la configuración del servidor de desarrollo de Flask. ¿Alguna idea de lo que debe configurarse para habilitar esto?

sa125
fuente

Respuestas:

712

Si bien esto es posible, no debe usar el servidor de desarrollo Flask en producción. El servidor de desarrollo de Flask no está diseñado para ser particularmente seguro, estable o eficiente. Consulte los documentos sobre la implementación de soluciones correctas.


Agregue un parámetro a su app.run(). De forma predeterminada, se ejecuta en localhost, cámbielo a app.run(host= '0.0.0.0')la dirección IP de su máquina.

Documentado en el sitio de Flask en "Servidor visible externamente" en la página de Inicio rápido :

Servidor visible externamente

Si ejecuta el servidor, notará que el servidor solo está disponible desde su propia computadora, no desde cualquier otro en la red. Este es el valor predeterminado porque en modo de depuración, un usuario de la aplicación puede ejecutar código Python arbitrario en su computadora. Si ha desactivado la depuración o confía en los usuarios de su red, puede hacer que el servidor esté disponible públicamente.

Simplemente cambie la llamada del run()método para que se vea así:

app.run(host='0.0.0.0')

Esto le dice a su sistema operativo que escuche en una IP pública.

Shawn Swaner
fuente
44
Para configurar una aplicación IP específica.run (host = "192.168.1.7", puerto = 5010) útil si su PC tiene algunas IP's
lxx
2
cómo acceder a la secuencia de comandos del matraz globalmente, alojando en mi propio servidor
pyd
Esta solución también funciona para contenedores Docker. Esta publicación describe la solución para estos casos.
para mac: no pude acceder a mi aplicación de matraz en 0.0.0.0 (aunque se sirvió allí), excepto al apuntar al dominio especificado en Preferencias del sistema> Compartir . El dominio debería ser algo así mymacname.local.
Nico Cernek
14
De alguna manera en mi Mac tengo que usarlo explícitamente flask run --host 0.0.0.0para que funcione.
Minh Nghĩa
122

Si usa el ejecutable del matraz para iniciar su servidor, puede flask run --host=0.0.0.0cambiar el valor predeterminado de 127.0.0.1 y abrirlo a conexiones no locales. Los métodos config y app.run que describen las otras respuestas son probablemente una mejor práctica, pero esto también puede ser útil.

Servidor visible externamente Si ejecuta el servidor, notará que solo se puede acceder al servidor desde su propia computadora, no desde cualquier otro en la red. Este es el valor predeterminado porque en modo de depuración, un usuario de la aplicación puede ejecutar código Python arbitrario en su computadora.

Si tiene el depurador deshabilitado o confía en los usuarios de su red, puede hacer que el servidor esté disponible públicamente simplemente agregando --host = 0.0.0.0 a la línea de comando:

flask run --host = 0.0.0.0 Esto le dice a su sistema operativo que escuche en todas las IP públicas.

Referencia: http://flask.pocoo.org/docs/0.11/quickstart/

Aria
fuente
2
No sé si alguien más lo ha experimentado, pero probé este método primero según los documentos de QuickStart, pero por alguna extraña razón la IP siguió ejecutándose 127.0.0.1(configuré mi ejecutable Flask correctamente, o eso parecía, no fue así). seguro de lo que estaba haciendo mal). Sin embargo, después de agregar app.run(host='0.0.0.0')como se indica en otra respuesta al archivo de mi servidor, pude acceder a la página a través de las redes. ¿Alguien más tiene un problema como el que describí o tiene alguna información al respecto?
twknab
2
Para mí, la ejecución del matraz --host = 0.0.0.0 resuelve el problema. Pude acceder a url -http: // <dirección ip>: 5000. Primero verifiqué cuáles son los puertos abiertos en la máquina usando el comando - sudo firewall-cmd --zone = public --list-ports, luego supe que el puerto 5000 no está abierto. Abrí este puerto usando el comando - sudo firewall-cmd --zone = public --permanent --add-port = 5000 / tcp seguido de sudo firewall-cmd --reload. luego, ejecute la aplicación matraz como - matraz --host = 0.0.0.0
Pintu Kumar
24

Pruebe esto si el método 0.0.0.0 no funciona

Cosas aburridas

Personalmente luché mucho para que mi aplicación fuera accesible a otros dispositivos (computadoras portátiles y teléfonos móviles) a través de un servidor local. Probé el método 0.0.0.0, pero no tuve suerte. Luego intenté cambiar el puerto, pero simplemente no funcionó. Entonces, después de probar varias combinaciones diferentes, llegué a esta y resolvió mi problema de implementar mi aplicación en un servidor local.

Pasos

  1. Obtenga la dirección IPv4 local de su computadora. Esto se puede hacer escribiendo ipconfigen Windows y ifconfigen Linux y Mac.

IPv4 (Windows)

Tenga en cuenta: El paso anterior se debe realizar en la máquina en la que está sirviendo la aplicación, y no en la máquina en la que está accediendo a ella. También tenga en cuenta que la dirección IPv4 podría cambiar si se desconecta y se vuelve a conectar a la red.

  1. Ahora, simplemente ejecute la aplicación de matraz con la dirección IPv4 adquirida.

    flask run -h 192.168.X.X

    Por ejemplo, en mi caso (ver la imagen), lo ejecuté como:

    flask run -h 192.168.1.100

ejecutando la aplicación matraz

En mi dispositivo móvil

captura de pantalla desde mi teléfono móvil

Cosas opcionales

Si está realizando este procedimiento en Windows y está utilizando Power Shell como CLI, y aún no puede acceder al sitio web, pruebe con un comando CTRL + C en el shell que ejecuta la aplicación. Power Shell se congela a veces y necesita un pellizco para revivir. Hacer esto podría incluso terminar el servidor, pero a veces funciona.

Eso es. Dale "me gusta" si te parece útil.

Algunas cosas más opcionales

He creado un breve script de Powershell que le proporcionará su dirección IP cuando la necesite:

$env:getIp = ipconfig
if ($env:getIp -match '(IPv4[\sa-zA-Z.]+:\s[0-9.]+)') {
    if ($matches[1] -match '([^a-z\s][\d]+[.\d]+)'){
        $ipv4 = $matches[1]
    }
}
echo $ipv4

Guárdelo en un archivo con extensión .ps1 (para PowerShell) y ejecútelo antes de iniciar su aplicación. Puede guardarlo en su carpeta de proyecto y ejecutarlo como:

.\getIP.ps1; flask run -h $ipv4

Nota: guardé el código de shell anterior en getIP.ps1.

Genial.

nwillo
fuente
1
¡Si! funciona. soy capaz de obtenerlo en mi móvil configurando ipv4 ip en flask. ojalá también ayude a otros :)
Ashu Kumar
@nwillo do mobile y la máquina en la que sirvo se conectan a la misma red / wifi.
Sachin Rathod
@sachinrathod sí. Tienen que. Así es como pueden acceder a la misma puerta de enlace IP.
nwillo
22

Si su coolaplicación tiene su configuración cargada desde un archivo externo, como en el siguiente ejemplo, no olvide actualizar el archivo de configuración correspondiente con HOST = "0.0.0.0"

cool.app.run(
    host=cool.app.config.get("HOST", "localhost"),
    port=cool.app.config.get("PORT", 9000)
)            
mircealungu
fuente
1
Esta es una buena manera de almacenar también el nombre de host y el número de puerto en la configuración del matraz. Estaba buscando exactamente esta solución.
compie
20

Agregue las siguientes líneas a su proyecto

if __name__ == '__main__':
    app.debug = True
    app.run(host = '0.0.0.0',port=5005)
Jeevan Chaitanya
fuente
Me estoy poniendoOSError: [WinError 10013] An attempt was made to access a socket in a way forbidden by its access permissions
pyd
Para saber cómo solucionarlo , debe ejecutar el archivo python con ejecutar como administrador y verificar que cualquier puerto se esté ejecutando en Windows netstat -na|findstr 5005.
Jeevan Chaitanya
10

¿Verifica si el puerto particular está abierto en el servidor para servir al cliente o no?

en Ubuntu o distribución de Linux

sudo ufw enable
sudo ufw allow 5000/tcp //allow the server to handle the request on port 5000

Configure la aplicación para manejar solicitudes remotas

app.run(host='0.0.0.0' , port=5000)


python3 app.py & #run application in background
Rajesh Prasad Yadav
fuente
5

Vaya a la ruta de su proyecto en CMD (símbolo del sistema) y ejecute el siguiente comando: -

establecer FLASK_APP = ABC.py

SET FLASK_ENV = desarrollo

frasco ejecutar -h [yourIP] -p 8080

obtendrá siguiente o / p en CMD: -

  • Sirviendo la aplicación Flask "expirement.py" (carga diferida)
    • Medio ambiente: desarrollo
    • Modo de depuración: activado
    • Reiniciar con stat
    • ¡El depurador está activo!
    • PIN del depurador: 199-519-700
    • Se ejecuta en http: // [yourIP]: 8080 / (Presione CTRL + C para salir)

Ahora puede acceder a su aplicación de matraz en otra máquina utilizando http: // [yourIP]: 8080 / url

Ibz.Shaikh
fuente
4

Si tiene problemas para acceder a su servidor Flask, implementado usando PyCharm , tenga en cuenta lo siguiente:

PyCharm no ejecuta su archivo .py principal directamente, por if __name__ == '__main__':lo que no se ejecutará ningún código y los cambios (como app.run(host='0.0.0.0', port=5000)) no tendrán efecto.

En su lugar, debe configurar el servidor Flask usando Configuraciones de ejecución, en particular, colocando --host 0.0.0.0 --port 5000en el campo Opciones adicionales .

Ejecute las configuraciones del servidor Flask PyCharm

Más información sobre la configuración del servidor Flask en PyCharm

Viacheslav Z
fuente
¡Esto realmente resolvió todos mis problemas y debería ser la respuesta correcta a esta pregunta!
Alberto Bellini
3

Tuve el mismo problema, utilizo PyCharm como editor y cuando creé el proyecto, PyCharm creó un servidor Flask. Lo que hice fue crear un servidor con Python de la siguiente manera;

Config Python Server PyCharm Básicamente lo que hice fue crear un nuevo servidor, pero un matraz, si no Python

Espero que te ayude

Juanes30
fuente
No solo publique una imagen: describa específicamente lo que hace para resolver el problema.
CertainPerformance el
Hola, por supuesto, si ya estoy editando la publicación para mejorar la respuesta.
Juanes30
3

Esta respuesta no se relaciona únicamente con el matraz, sino que debe ser aplicable para que todos no puedan conectarse al servicio desde otro problema de host .

  1. use netstat -ano | grep <port>para ver si la dirección es 0.0.0.0 o ::. Si es 127.0.0.1, entonces es solo para las solicitudes locales.
  2. use tcpdump para ver si falta algún paquete. Si muestra un desequilibrio obvio, verifique las reglas de enrutamiento con iptables.

Hoy ejecuto mi aplicación de matraz como de costumbre, pero noté que no se puede conectar desde otro servidor. Luego ejecuto netstat -ano | grep <port>, y la dirección local es ::o 0.0.0.0(probé ambas, y sé que 127.0.0.1 solo permite la conexión desde el host local). Entonces solía telnet host port, el resultado es como connect to .... Esto es muy raro Entonces pensé que sería mejor comprobarlo tcpdump -i any port <port> -w w.pcap. Y noté que todo es así:

El resultado de tcpdump muestra que solo hay paquetes SYN del host remoto

Luego, al revisar la iptables --listsección SALIDA, pude ver varias reglas:

resultado de la lista de iptables

Estas reglas prohíben la salida de paquetes vitales tcp en el protocolo de enlace. Al eliminarlos, el problema se ha ido.

Tiina
fuente
3

Para mí seguí la respuesta anterior y la modifiqué un poco:

  1. Simplemente tome su dirección ipv4 usando ipconfig en el símbolo del sistema
  2. Vaya al archivo en el que está presente el código del matraz
  3. En la función principal, escriba app.run (host = 'su dirección ipv4')

P.ej:

ingrese la descripción de la imagen aquí

Arsalan Fakhar
fuente
1

ir a la ruta del proyecto conjunto FLASK_APP = ABC.py SET FLASK_ENV = desarrollo

frasco ejecutado -h [yourIP] -p 8080 seguirá o / p en CMD: - * Sirviendo la aplicación Flask "expirement.py" (carga diferida) * Entorno: desarrollo * Modo de depuración: activado * Reinicio con stat * El depurador está activo ! * PIN del depurador: 199-519-700 * Ejecutando en http: // [yourIP]: 8080 / (Presione CTRL + C para salir)

Ibz.Shaikh
fuente
1

También puede configurar el host (para exponerlo en una red con dirección IP) y el puerto a través de variables de entorno.

$ export FLASK_APP=app.py
$ export FLASK_ENV=development
$ export FLASK_RUN_PORT=8000
$ export FLASK_RUN_HOST=0.0.0.0

$ flask run
 * Serving Flask app "app.py" (lazy loading)
 * Environment: development
 * Debug mode: on
 * Running on https://0.0.0.0:5000/ (Press CTRL+C to quit)
 * Restarting with stat
 * Debugger is active!
 * Debugger PIN: 329-665-000

Consulte ¿Cómo obtener todas las Opciones de comando disponibles para establecer variables de entorno?

Everett Toews
fuente
1

Crear archivo .flaskenven el directorio raíz del proyecto.

Los parámetros en este archivo son típicamente:

FLASK_APP=app.py
FLASK_ENV=development
FLASK_RUN_HOST=[dev-host-ip]
FLASK_RUN_PORT=5000

Si tiene un entorno virtual, actívelo y realice una pip install python-dotenv.

Este paquete va a usar el .flaskenvarchivo, y las declaraciones dentro de él se importarán automáticamente en las sesiones de terminal.

Entonces puedes hacer flask run

Saurabh
fuente