Configurer le serveur de développement Flask pour qu'il soit visible sur le réseau

444

Je ne sais pas si cela est spécifique à Flask, mais lorsque j'exécute une application en mode dev ( http://localhost:5000), je ne peux pas y accéder à partir d'autres machines du réseau (avec http://[dev-host-ip]:5000). Avec Rails en mode dev, par exemple, cela fonctionne très bien. Je n'ai trouvé aucun document concernant la configuration du serveur de développement Flask. Une idée de ce qui devrait être configuré pour activer cela?

sa125
la source

Réponses:

714

Bien que cela soit possible, vous ne devez pas utiliser le serveur de développement Flask en production. Le serveur de développement Flask n'est pas conçu pour être particulièrement sécurisé, stable ou efficace. Voir les documents sur le déploiement pour des solutions correctes.


Ajoutez un paramètre à votre app.run(). Par défaut, il s'exécute sur localhost, remplacez-le par pour app.run(host= '0.0.0.0')qu'il s'exécute sur l'adresse IP de votre machine.

Documenté sur le site Flask sous "Externally Visible Server" sur la page Quickstart :

Serveur visible de l'extérieur

Si vous exécutez le serveur, vous remarquerez que le serveur est uniquement disponible à partir de votre propre ordinateur, pas de tout autre sur le réseau. Il s'agit de la valeur par défaut car en mode débogage, un utilisateur de l'application peut exécuter du code Python arbitraire sur votre ordinateur. Si le débogage est désactivé ou si vous faites confiance aux utilisateurs de votre réseau, vous pouvez rendre le serveur accessible au public.

Modifiez simplement l'appel de la run()méthode pour qu'elle ressemble à ceci:

app.run(host='0.0.0.0')

Cela indique à votre système d'exploitation d'écouter sur une IP publique.

Shawn Swaner
la source
44
Pour définir un IP app.run spécifique (hôte = "192.168.1.7", port = 5010) pratique si votre PC a quelques IP
lxx
2
comment accéder au script de la fiole à l'échelle mondiale, en hébergeant sur mon propre serveur
pyd
Cette solution fonctionne également pour les conteneurs Docker. Cet article décrit la solution pour ces cas.
pour mac: je ne pouvais pas accéder à mon application flask à 0.0.0.0 (même si elle y était servie), sauf en ciblant le domaine spécifié dans Préférences Système> Partage . Le domaine devrait ressembler à quelque chose mymacname.local.
Nico Cernek
14
D'une manière ou d'une autre sur mon Mac, je dois explicitement l'utiliser flask run --host 0.0.0.0pour le faire fonctionner.
Minh Nghĩa
123

Si vous utilisez l'exécutable flask pour démarrer votre serveur, vous pouvez utiliser flask run --host=0.0.0.0pour modifier la valeur par défaut de 127.0.0.1 et l'ouvrir aux connexions non locales. Les méthodes config et app.run décrites dans les autres réponses sont probablement une meilleure pratique mais cela peut aussi être pratique.

Serveur visible de l'extérieur Si vous exécutez le serveur, vous remarquerez que le serveur n'est accessible que depuis votre propre ordinateur, et non depuis un autre du réseau. Il s'agit de la valeur par défaut car en mode débogage, un utilisateur de l'application peut exécuter du code Python arbitraire sur votre ordinateur.

Si le débogueur est désactivé ou que vous faites confiance aux utilisateurs de votre réseau, vous pouvez rendre le serveur accessible au public en ajoutant simplement --host = 0.0.0.0 à la ligne de commande:

flask run --host = 0.0.0.0 Ceci indique à votre système d'exploitation d'écouter sur toutes les adresses IP publiques.

Référence: http://flask.pocoo.org/docs/0.11/quickstart/

Aria
la source
2
Je ne sais pas si quelqu'un d'autre l'a expérimenté, mais j'ai d'abord essayé cette méthode selon les documents QuickStart, mais pour une raison étrange, l'IP a continué à fonctionner 127.0.0.1(j'ai configuré correctement mon exécutable Flask, ou du moins il me semblait, n'était pas sûr de ce que je faisais mal). Cependant, après avoir ajouté app.run(host='0.0.0.0')comme indiqué dans une autre réponse dans mon fichier serveur, j'ai pu accéder à la page sur les réseaux. Quelqu'un d'autre a un problème comme celui que j'ai décrit ou a des informations à ce sujet?
twknab
2
Pour moi, flask run --host = 0.0.0.0 résout le problème. J'ai pu accéder à l'URL -http: // <adresse IP>: 5000. J'ai d'abord vérifié quels sont les ports ouverts sur la machine à l'aide de la commande - sudo firewall-cmd --zone = public --list-ports, puis j'ai appris que le port 5000 n'était pas ouvert. J'ai ouvert ce port en utilisant la commande - sudo firewall-cmd --zone = public --permanent --add-port = 5000 / tcp suivi de sudo firewall-cmd --reload. ensuite, exécutez l'application flask comme - flask run --host = 0.0.0.0
Pintu Kumar
25

Essayez ceci si la méthode 0.0.0.0 ne fonctionne pas

Truc ennuyant

J'ai personnellement beaucoup lutté pour que mon application soit accessible à d'autres appareils (ordinateurs portables et téléphones portables) via un serveur local. J'ai essayé la méthode 0.0.0.0, mais pas de chance. Ensuite, j'ai essayé de changer le port, mais cela n'a tout simplement pas fonctionné. Donc, après avoir essayé un tas de combinaisons différentes, je suis arrivé à celui-ci, et cela a résolu mon problème de déploiement de mon application sur un serveur local.

Pas

  1. Obtenez l'adresse IPv4 locale de votre ordinateur. Cela peut être fait en tapant ipconfigsur Windows et ifconfigsur Linux et Mac.

IPv4 (Windows)

Remarque: l'étape ci-dessus doit être effectuée sur la machine sur laquelle vous utilisez l'application, et non sur la machine sur laquelle vous y accédez. Notez également que l'adresse IPv4 peut changer si vous vous déconnectez et vous reconnectez au réseau.

  1. Maintenant, exécutez simplement l'application flask avec l'adresse IPv4 acquise.

    flask run -h 192.168.X.X

    Par exemple, dans mon cas (voir l'image), je l'ai exécuté comme:

    flask run -h 192.168.1.100

exécuter l'application flask

Sur mon appareil mobile

capture d'écran de mon téléphone portable

Trucs en option

Si vous effectuez cette procédure sous Windows et utilisez Power Shell en tant que CLI et que vous ne parvenez toujours pas à accéder au site Web, essayez une commande CTRL + C dans le shell qui exécute l'application. Power Shell se fige parfois et il a besoin d'une pincée pour revivre. Cela pourrait même mettre fin au serveur, mais cela fait parfois l'affaire.

C'est ça. Donnez un coup de pouce si vous avez trouvé cela utile.

Quelques trucs plus optionnels

J'ai créé un court script Powershell qui vous obtiendra votre adresse IP chaque fois que vous en aurez besoin:

$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

Enregistrez-le dans un fichier avec l'extension .ps1 (pour PowerShell) et exécutez-le avant de démarrer votre application. Vous pouvez l'enregistrer dans votre dossier de projet et l'exécuter en tant que:

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

Remarque: j'ai enregistré le code shell ci-dessus dans getIP.ps1.

Cool.👌

nwillo
la source
1
Ouais! Ça marche. Je suis capable de le récupérer sur mon mobile en définissant ipv4 ip sur flask. j'espère que cela aidera aussi les autres :)
Ashu Kumar
@nwillo do mobile et la machine sur laquelle je sers doivent être connectés au même wifi / réseau.
sachin rathod
@sachinrathod yes. ils doivent. C'est ainsi qu'ils peuvent accéder à la même passerelle IP.
nwillo
22

Si votre coolapplication a sa configuration chargée à partir d'un fichier externe, comme dans l'exemple suivant, n'oubliez pas de mettre à jour le fichier de configuration correspondant avec HOST = "0.0.0.0"

cool.app.run(
    host=cool.app.config.get("HOST", "localhost"),
    port=cool.app.config.get("PORT", 9000)
)            
mircealungu
la source
1
C'est une bonne façon de stocker également le nom d'hôte et le numéro de port dans la configuration du flacon. Je cherchais exactement cette solution.
compie
20

Ajoutez des lignes ci-dessous à votre projet

if __name__ == '__main__':
    app.debug = True
    app.run(host = '0.0.0.0',port=5005)
Jeevan Chaitanya
la source
Je reçoisOSError: [WinError 10013] An attempt was made to access a socket in a way forbidden by its access permissions
pyd
Pour résoudre ce problème Vous devez exécuter le fichier python avec Exécuter en tant qu'administrateur et vérifier que n'importe quel port fonctionne sous Windows netstat -na|findstr 5005.
Jeevan Chaitanya
10

Vérifiez si le port particulier est ouvert sur le serveur pour servir le client ou non?

dans la distribution Ubuntu ou Linux

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

Configurer l'application pour gérer les requêtes distantes

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


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

Accédez à votre chemin de projet sur CMD (invite de commande) et exécutez la commande suivante: -

définir FLASK_APP = ABC.py

SET FLASK_ENV = développement

flask run -h [yourIP] -p 8080

vous obtiendrez o / p suivant sur CMD: -

  • Au service de l'application Flask "expiration.py" (chargement paresseux)
    • Environnement: développement
    • Mode de débogage: activé
    • Redémarrage avec stat
    • Le débogueur est actif!
    • NIP du débogueur: 199-519-700
    • Fonctionnant sur http: // [yourIP]: 8080 / (Appuyez sur CTRL + C pour quitter)

Vous pouvez maintenant accéder à votre application flask sur une autre machine en utilisant http: // [yourIP]: 8080 / url

Ibz.Shaikh
la source
4

Si vous rencontrez des problèmes pour accéder à votre serveur Flask, déployé à l'aide de PyCharm , prenez en compte les éléments suivants:

PyCharm n'exécute pas votre fichier .py principal directement, donc tout code if __name__ == '__main__':ne sera pas exécuté et aucune modification (comme app.run(host='0.0.0.0', port=5000)) ne prendra effet.

Au lieu de cela, vous devez configurer le serveur Flask à l'aide de Run Configurations, en particulier, en le plaçant --host 0.0.0.0 --port 5000dans le champ Options supplémentaires .

Exécuter les cofigurations du serveur Flask PyCharm

En savoir plus sur la configuration du serveur Flask dans PyCharm

Viacheslav Z
la source
Cela a en fait résolu tous mes problèmes et devrait être la bonne réponse à cette question!
Alberto Bellini
4

Pour moi, j'ai suivi la réponse ci-dessus et l'ai légèrement modifiée:

  1. Saisissez simplement votre adresse ipv4 à l'aide d'ipconfig à l'invite de commande
  2. Accédez au fichier dans lequel le code du flacon est présent
  3. Dans la fonction principale, écrivez app.run (host = 'votre adresse ipv4')

Par exemple:

entrez la description de l'image ici

Arsalan Fakhar
la source
3

J'ai eu le même problème, j'utilise PyCharm en tant qu'éditeur et lorsque j'ai créé le projet, PyCharm a créé un serveur Flask. J'ai créé un serveur avec Python de la manière suivante;

Config Python Server PyCharm essentiellement ce que je faisais était de créer un nouveau serveur mais flacon sinon python

J'espère que ça t'aide

Juanes30
la source
Veuillez ne pas simplement publier une image - décrivez précisément ce que vous faites pour résoudre le problème.
CertainPerformance
Hé, bien sûr, si je modifie déjà le message pour améliorer la réponse.
Juanes30
3

Cette réponse n'est pas uniquement liée au flacon, mais devrait être applicable pour tous les services ne pouvant pas se connecter à partir d'un autre problème d' hôte .

  1. utilisez netstat -ano | grep <port>pour voir si l'adresse est 0.0.0.0 ou ::. S'il s'agit de 127.0.0.1, c'est uniquement pour les requêtes locales.
  2. utilisez tcpdump pour voir s'il manque un paquet. S'il montre un déséquilibre évident, vérifiez les règles de routage par iptables.

Aujourd'hui, je lance mon application flask comme d'habitude, mais j'ai remarqué qu'elle ne peut pas se connecter à partir d'un autre serveur. Ensuite, je cours netstat -ano | grep <port>, et l'adresse locale est ::ou 0.0.0.0(j'ai essayé les deux, et je sais que 127.0.0.1 autorise uniquement la connexion à partir de l'hôte local). Ensuite, j'ai utilisé telnet host port, le résultat est comme connect to .... C'est très étrange. Ensuite, j'ai pensé que je ferais mieux de le vérifier avec tcpdump -i any port <port> -w w.pcap. Et j'ai remarqué que c'est comme ça:

Le résultat de tcpdump montre qu'il n'y a que des paquets SYN de l'hôte distant

Ensuite, en vérifiant la iptables --listsection OUTPUT, j'ai pu voir plusieurs règles:

résultat de la liste iptables

ces règles interdisent la sortie des paquets vitaux TCP lors de l'établissement d'une liaison. En les supprimant, le problème a disparu.

Tiina
la source
1

aller au chemin du projet set FLASK_APP = ABC.py SET FLASK_ENV = development

flask run -h [yourIP] -p 8080 vous suivrez o / p sur CMD: - * Servant l'application Flask "expiration.py" (chargement paresseux) * Environnement: développement * Mode débogage: activé * Redémarrage avec stat * Le débogueur est actif ! * Code PIN du débogueur: 199-519-700 * Fonctionne sur http: // [yourIP]: 8080 / (Appuyez sur CTRL + C pour quitter)

Ibz.Shaikh
la source
1

Vous pouvez également définir l'hôte (pour l'exposer sur une adresse IP réseau) et le port via des variables d'environnement.

$ 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

Voir Comment obtenir toutes les options de commande disponibles pour définir les variables d'environnement?

Everett Toews
la source
1

Créez un fichier .flaskenvdans le répertoire racine du projet.

Les paramètres de ce fichier sont généralement:

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

Si vous disposez d'un environnement virtuel, activez-le et procédez comme suit pip install python-dotenv.

Ce paquet va utiliser le .flaskenvfichier et les déclarations qu'il contient seront automatiquement importées à travers les sessions de terminal.

Ensuite, vous pouvez faire flask run

Saurabh
la source