Konfigurieren Sie den Flask-Entwicklungsserver so, dass er im gesamten Netzwerk sichtbar ist

442

Ich bin nicht sicher, ob dies Flask-spezifisch ist, aber wenn ich eine App im Entwicklungsmodus ( http://localhost:5000) ausführe , kann ich nicht von anderen Computern im Netzwerk (mit http://[dev-host-ip]:5000) darauf zugreifen . Mit Rails im Dev-Modus funktioniert es beispielsweise einwandfrei. Ich konnte keine Dokumente zur Konfiguration des Flask Dev-Servers finden. Irgendeine Idee, was konfiguriert werden sollte, um dies zu ermöglichen?

sa125
quelle

Antworten:

712

Dies ist zwar möglich, Sie sollten den Flask-Entwicklungsserver jedoch nicht in der Produktion verwenden. Der Flask-Entwicklungsserver ist nicht besonders sicher, stabil oder effizient. In den Dokumenten zur Bereitstellung finden Sie die richtigen Lösungen.


Fügen Sie Ihrem einen Parameter hinzu app.run(). Standardmäßig wird es auf localhost ausgeführt. Ändern Sie es so app.run(host= '0.0.0.0'), dass es auf der IP-Adresse Ihres Computers ausgeführt wird.

Dokumentiert auf der Flask-Site unter "Extern sichtbarer Server" auf der Schnellstartseite :

Extern sichtbarer Server

Wenn Sie den Server ausführen, werden Sie feststellen, dass der Server nur von Ihrem eigenen Computer aus verfügbar ist, nicht von einem anderen im Netzwerk. Dies ist die Standardeinstellung, da ein Benutzer der Anwendung im Debugging-Modus beliebigen Python-Code auf Ihrem Computer ausführen kann. Wenn Sie das Debuggen deaktiviert haben oder den Benutzern in Ihrem Netzwerk vertrauen, können Sie den Server öffentlich verfügbar machen.

Ändern Sie einfach den Aufruf der run()Methode so, dass er so aussieht:

app.run(host='0.0.0.0')

Dies weist Ihr Betriebssystem an, eine öffentliche IP-Adresse abzuhören.

Shawn Swaner
quelle
44
Zum Einstellen auf eine bestimmte IP-App.run (host = "192.168.1.7", port = 5010) praktisch, wenn Ihr PC einige IPs hat
lxx
2
Wie man global auf das
Flask-
Diese Lösung funktioniert auch für Docker-Container. Dieser Beitrag beschreibt die Lösung für diese Fälle.
für Mac: Ich konnte unter 0.0.0.0 nicht auf meine Flask-App zugreifen (obwohl sie dort bereitgestellt wurde), außer indem ich auf die in den Systemeinstellungen> Freigabe angegebene Domäne abzielte . Die Domain sollte so etwas wie sein mymacname.local.
Nico Cernek
14
Irgendwie muss ich auf meinem Mac explizit verwenden flask run --host 0.0.0.0, damit es funktioniert.
Minh Nghĩa
122

Wenn Sie die ausführbare Flask-Datei zum Starten Ihres Servers verwenden, können Sie flask run --host=0.0.0.0die Standardeinstellung von 127.0.0.1 ändern und für nicht lokale Verbindungen öffnen. Die in den anderen Antworten beschriebenen Methoden config und app.run sind wahrscheinlich besser, aber dies kann auch nützlich sein.

Extern sichtbarer Server Wenn Sie den Server ausführen, werden Sie feststellen, dass auf den Server nur von Ihrem eigenen Computer aus zugegriffen werden kann, nicht von einem anderen im Netzwerk. Dies ist die Standardeinstellung, da ein Benutzer der Anwendung im Debugging-Modus beliebigen Python-Code auf Ihrem Computer ausführen kann.

Wenn Sie den Debugger deaktiviert haben oder den Benutzern in Ihrem Netzwerk vertrauen, können Sie den Server öffentlich verfügbar machen, indem Sie einfach --host = 0.0.0.0 zur Befehlszeile hinzufügen:

flask run --host = 0.0.0.0 Dies weist Ihr Betriebssystem an, alle öffentlichen IPs abzuhören.

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

Arie
quelle
2
Ich weiß nicht, ob es jemand anderes erlebt hat, aber ich habe diese Methode zuerst gemäß den QuickStart-Dokumenten ausprobiert, aber aus irgendeinem seltsamen Grund lief die IP-Adresse weiter 127.0.0.1(ich habe meine ausführbare Flask-Datei ordnungsgemäß eingerichtet, oder so schien es nicht sicher, was ich falsch gemacht habe). Nachdem ich app.run(host='0.0.0.0')meine Serverdatei wie in einer anderen Antwort angegeben hinzugefügt hatte , konnte ich über Netzwerke auf die Seite zugreifen. Hat noch jemand ein Problem wie das, das ich beschrieben habe, oder hat er irgendwelche Informationen dazu?
Twknab
2
Für mich behebt flask run --host = 0.0.0.0 das Problem. Ich konnte auf die URL -http: // <IP-Adresse>: 5000 zugreifen. Zuerst habe ich mit dem Befehl - sudo firewall-cmd --zone = public --list-ports überprüft, welche Ports auf dem Computer geöffnet sind. Dann habe ich festgestellt, dass Port 5000 nicht geöffnet ist. Ich habe diesen Port mit dem Befehl - sudo firewall-cmd --zone = public --permanent --add-port = 5000 / tcp geöffnet, gefolgt von sudo firewall-cmd --reload. Führen Sie dann die Kolben-App aus als - Kolbenlauf
Host
23

Versuchen Sie dies, wenn die 0.0.0.0-Methode nicht funktioniert

Langweiliges Zeug

Ich persönlich habe viel gekämpft, um meine App über einen lokalen Server für andere Geräte (Laptops und Mobiltelefone) zugänglich zu machen. Ich habe die 0.0.0.0-Methode ausprobiert, aber kein Glück. Dann habe ich versucht, den Port zu ändern, aber es hat einfach nicht funktioniert. Nachdem ich eine Reihe verschiedener Kombinationen ausprobiert hatte, kam ich zu dieser und sie löste mein Problem, meine App auf einem lokalen Server bereitzustellen.

Schritte

  1. Rufen Sie die lokale IPv4-Adresse Ihres Computers ab. Dies kann durch Eingabe ipconfigunter Windows sowie ifconfigunter Linux und Mac erfolgen.

IPv4 (Windows)

Bitte beachten Sie: Der obige Schritt muss auf dem Computer ausgeführt werden, auf dem Sie die App bereitstellen, und nicht auf dem Computer, auf dem Sie darauf zugreifen. Beachten Sie auch, dass sich die IPv4-Adresse möglicherweise ändert, wenn Sie die Verbindung zum Netzwerk trennen und erneut herstellen.

  1. Führen Sie jetzt einfach die Kolben-App mit der erfassten IPv4-Adresse aus.

    flask run -h 192.168.X.X

    ZB In meinem Fall (siehe Bild) habe ich es wie folgt ausgeführt:

    flask run -h 192.168.1.100

Ausführen der Kolben-App

Auf meinem mobilen Gerät

Screenshot von meinem Handy

Optionales Zeug

Wenn Sie dieses Verfahren unter Windows ausführen und Power Shell als CLI verwenden und immer noch nicht auf die Website zugreifen können, versuchen Sie einen STRG + C-Befehl in der Shell, in der die App ausgeführt wird. Power Shell wird manchmal eingefroren und es braucht eine Prise, um wiederzubeleben. Dadurch wird möglicherweise sogar der Server beendet, aber manchmal reicht dies aus.

Das ist es. Geben Sie einen Daumen hoch, wenn Sie dies hilfreich fanden

Noch ein paar optionale Sachen

Ich habe ein kurzes Powershell-Skript erstellt, mit dem Sie Ihre IP-Adresse erhalten, wann immer Sie eine benötigen:

$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

Speichern Sie es in einer Datei mit der Erweiterung .ps1 (für PowerShell) und führen Sie es aus, bevor Sie Ihre App starten. Sie können es in Ihrem Projektordner speichern und ausführen als:

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

Hinweis: Ich habe den obigen Shell-Code in getIP.ps1 gespeichert.

Cool.👌

nwillo
quelle
1
Ja! Es klappt. Ich bin in der Lage, es auf meinem Handy zu starten, indem ich IPv4 IP auf Flasche setze. hoffentlich hilft es auch anderen :)
Ashu Kumar
@nwillo do mobile und die Maschine, auf der ich diene, sind mit demselben WLAN / Netzwerk verbunden.
Sachin Rathod
@sachinrathod ja. Sie müssen. Auf diese Weise können sie auf dasselbe IP-Gateway zugreifen.
nwillo
22

Wenn cooldie Konfiguration Ihrer App wie im folgenden Beispiel aus einer externen Datei geladen wurde, vergessen Sie nicht, die entsprechende Konfigurationsdatei mit HOST = "0.0.0.0" zu aktualisieren.

cool.app.run(
    host=cool.app.config.get("HOST", "localhost"),
    port=cool.app.config.get("PORT", 9000)
)            
mircealungu
quelle
1
Dies ist eine gute Möglichkeit, den Hostnamen und die Portnummer auch in der Kolbenkonfiguration zu speichern. Ich habe genau diese Lösung gesucht.
Compie
20

Fügen Sie Ihrem Projekt die folgenden Zeilen hinzu

if __name__ == '__main__':
    app.debug = True
    app.run(host = '0.0.0.0',port=5005)
Jeevan Chaitanya
quelle
Ich OSError: [WinError 10013] An attempt was made to access a socket in a way forbidden by its access permissions
bekomme
So beheben Sie das Problem Sie müssen die Python-Datei mit "Als Administrator ausführen" ausführen und überprüfen, ob ein Port unter Windows ausgeführt wird netstat -na|findstr 5005.
Jeevan Chaitanya
10

Überprüfen Sie, ob der bestimmte Port auf dem Server geöffnet ist, um den Client zu bedienen, oder nicht.

in Ubuntu oder Linux Distribution

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

Konfigurieren Sie die Anwendung für die Verarbeitung von Remoteanforderungen

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


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

Gehen Sie auf CMD zu Ihrem Projektpfad (Eingabeaufforderung) und führen Sie den folgenden Befehl aus: -

setze FLASK_APP = ABC.py.

SET FLASK_ENV = Entwicklung

Kolbenlauf -h [yourIP] -p 8080

Sie erhalten folgende O / P auf CMD: -

Jetzt können Sie über http: // [yourIP]: 8080 / url auf einem anderen Computer auf Ihre Kolben-App zugreifen

Ibz.Shaikh
quelle
4

Wenn Sie Probleme beim Zugriff auf Ihren mit PyCharm bereitgestellten Flask-Server haben, berücksichtigen Sie Folgendes:

PyCharm führt Ihre .py-Hauptdatei nicht direkt aus, sodass Code in if __name__ == '__main__':nicht ausgeführt wird und Änderungen (wie app.run(host='0.0.0.0', port=5000)) nicht wirksam werden.

Stattdessen sollten Sie den Flask-Server mithilfe von Konfigurationen ausführen konfigurieren, insbesondere indem Sie ihn --host 0.0.0.0 --port 5000in das Feld Zusätzliche Optionen einfügen.

Führen Sie die Konfigurationen des Flask-Servers PyCharm aus

Weitere Informationen zum Konfigurieren des Flask-Servers in PyCharm

Viacheslav Z.
quelle
Dies löste tatsächlich alle meine Probleme und sollte die richtige Antwort auf diese Frage sein!
Alberto Bellini
3

Ich hatte das gleiche Problem, ich benutze PyCharm als Editor und als ich das Projekt erstellte, erstellte PyCharm einen Flask Server. Ich habe auf folgende Weise einen Server mit Python erstellt:

Konfigurieren Sie Python Server PyCharm Im Grunde habe ich einen neuen Server erstellt, aber eine Flasche, wenn nicht Python

Ich hoffe es hilft dir

Juanes30
quelle
Bitte posten Sie nicht nur ein Bild - beschreiben Sie genau, was Sie tun, um das Problem zu beheben.
Bestimmte Leistung
Hey, natürlich, wenn ich den Beitrag bereits bearbeite, um die Antwort zu verbessern.
Juanes30
3

Diese Antwort bezieht sich nicht nur auf flask, sondern sollte für alle gelten, die keinen Dienst von einem anderen Host- Problem verbinden können.

  1. Verwenden netstat -ano | grep <port>Sie diese Option, um festzustellen, ob die Adresse 0.0.0.0 oder :: lautet. Wenn es 127.0.0.1 ist, ist es nur für die lokalen Anforderungen.
  2. Verwenden Sie tcpdump, um festzustellen, ob ein Paket fehlt. Wenn es ein offensichtliches Ungleichgewicht zeigt, überprüfen Sie die Routing-Regeln von iptables.

Heute starte ich meine Kolben-App wie gewohnt, habe aber festgestellt, dass keine Verbindung von einem anderen Server hergestellt werden kann. Dann starte ich netstat -ano | grep <port>und die lokale Adresse ist ::oder 0.0.0.0(ich habe beide ausprobiert und ich weiß, dass 127.0.0.1 nur eine Verbindung vom lokalen Host zulässt). Dann habe ich verwendet telnet host port, das Ergebnis ist wie connect to .... Das ist sehr seltsam. Dann dachte ich, ich sollte es besser überprüfen tcpdump -i any port <port> -w w.pcap. Und mir ist aufgefallen, dass alles so ist:

Das tcpdump-Ergebnis zeigt, dass nur SYN-Pakete vom Remote-Host vorhanden sind

iptables --listWenn ich dann den Abschnitt OUTPUT überprüfe, sehe ich verschiedene Regeln:

Ergebnis der Liste der iptables

Diese Regeln verbieten die Ausgabe von TCP-Vitalpaketen beim Handshake. Durch das Löschen ist das Problem behoben.

Tiina
quelle
3

Für mich folgte ich der obigen Antwort und änderte sie ein wenig:

  1. Rufen Sie einfach Ihre IPv4-Adresse mit ipconfig an der Eingabeaufforderung ab
  2. Gehen Sie zu der Datei, in der der Kolbencode vorhanden ist
  3. In der Hauptfunktion schreiben Sie app.run (host = 'Ihre IPv4-Adresse')

Z.B:

Geben Sie hier die Bildbeschreibung ein

Arsalan Fakhar
quelle
1

Gehe zum Projektpfad set FLASK_APP = ABC.py SET FLASK_ENV = Entwicklung

flask run -h [yourIP] -p 8080 Sie werden o / p auf CMD folgen: - * Serving Flask App "expirement.py" (verzögertes Laden) * Umgebung: Entwicklung * Debug-Modus: on * Neustart mit stat * Debugger ist aktiv ! * Debugger-PIN: 199-519-700 * Läuft unter http: // [yourIP]: 8080 / ( Drücken Sie STRG + C, um das Programm zu beenden.)

Ibz.Shaikh
quelle
1

Sie können den Host (um ihn in einem Netzwerk mit IP-Adresse verfügbar zu machen) und den Port auch über Umgebungsvariablen festlegen.

$ 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

Siehe Wie bekomme ich alle verfügbaren Befehlsoptionen zum Festlegen von Umgebungsvariablen?

Everett Toews
quelle
1

Erstellen Sie eine Datei .flaskenvim Projektstammverzeichnis.

Die Parameter in dieser Datei sind normalerweise:

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

Wenn Sie eine virtuelle Umgebung haben, aktivieren Sie diese und führen Sie eine aus pip install python-dotenv.

Dieses Paket verwendet die .flaskenvDatei und die darin enthaltenen Deklarationen werden automatisch über Terminalsitzungen importiert.

Dann können Sie tun flask run

Saurabh
quelle