Skonfiguruj serwer programistów Flask, aby był widoczny w sieci

443

Nie jestem pewien, czy jest to specyficzne dla Flask, ale kiedy uruchamiam aplikację w trybie deweloperskim ( http://localhost:5000), nie mogę uzyskać do niej dostępu z innych komputerów w sieci (z http://[dev-host-ip]:5000). Na przykład z Railsami w trybie deweloperskim działa dobrze. Nie mogłem znaleźć żadnych dokumentów dotyczących konfiguracji serwera deweloperskiego Flask. Masz pomysł, co należy skonfigurować, aby to umożliwić?

sa125
źródło

Odpowiedzi:

713

Chociaż jest to możliwe, nie należy używać serwera deweloperskiego Flask podczas produkcji. Serwer deweloperski Flask nie jest zaprojektowany jako szczególnie bezpieczny, stabilny ani wydajny. Prawidłowe rozwiązania znajdują się w dokumentacji dotyczącej wdrażania .


Dodaj parametr do swojego app.run(). Domyślnie działa na komputerze lokalnym, zmień go app.run(host= '0.0.0.0')na adres IP komputera.

Udokumentowane w witrynie Flask w sekcji „Zewnętrznie widoczny serwer” na stronie Szybki start :

Serwer widoczny z zewnątrz

Jeśli uruchomisz serwer, zauważysz, że serwer jest dostępny tylko z twojego komputera, a nie z jakiegokolwiek innego w sieci. Jest to ustawienie domyślne, ponieważ w trybie debugowania użytkownik aplikacji może wykonać dowolny kod w języku Python na komputerze. Jeśli wyłączono debugowanie lub ufasz użytkownikom w sieci, możesz udostępnić serwer publicznie.

Wystarczy zmienić wywołanie run()metody, aby wyglądała następująco:

app.run(host='0.0.0.0')

Mówi to systemowi operacyjnemu, aby nasłuchiwał na publicznym IP.

Shawn Swaner
źródło
44
Aby ustawić konkretną aplikację ip. Run (host = "192.168.1.7", port = 5010) przydatne, jeśli komputer ma kilka
adresów
2
jak uzyskać dostęp do skryptu flask globalnie, hosting na własnym serwerze
pyd
To rozwiązanie działa również w przypadku kontenerów Docker. W tym poście opisano rozwiązanie tych przypadków.
dla komputerów Mac: nie mogłem uzyskać dostępu do mojej aplikacji flask w wersji 0.0.0.0 (nawet jeśli tam ją serwowano), z wyjątkiem kierowania na domenę określoną w Preferencjach systemowych> Udostępnianie . Domena powinna być podobna mymacname.local.
Nico Cernek
14
Jakoś na moim Macu muszę jawnie użyć, flask run --host 0.0.0.0żeby to działało.
Minh Nghĩa
122

Jeśli używasz pliku wykonywalnego flask do uruchomienia serwera, możesz go użyć flask run --host=0.0.0.0do zmiany wartości domyślnej z 127.0.0.1 i otwarcia jej na połączenia nielokalne. Metody config i app.run, które opisują inne odpowiedzi, są prawdopodobnie lepszą praktyką, ale może to być również przydatne.

Serwer widoczny z zewnątrz Jeśli uruchomisz serwer, zauważysz, że serwer jest dostępny tylko z twojego komputera, a nie z jakiegokolwiek innego w sieci. Jest to ustawienie domyślne, ponieważ w trybie debugowania użytkownik aplikacji może wykonać dowolny kod w języku Python na komputerze.

Jeśli masz wyłączony debuger lub ufasz użytkownikom w sieci, możesz udostępnić serwer publicznie, po prostu dodając --host = 0.0.0.0 do wiersza poleceń:

uruchomienie kolby --host = 0.0.0.0 Informuje system operacyjny, aby nasłuchiwał na wszystkich publicznych adresach IP.

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

Aria
źródło
2
Nie wiem, czy ktoś jeszcze tego doświadczył, ale najpierw wypróbowałem tę metodę zgodnie z dokumentacją QuickStart, ale z jakiegoś dziwnego powodu IP nadal działało 127.0.0.1(ustawiłem mój plik wykonywalny Flask poprawnie, a przynajmniej tak się wydawało, nie był jasne, co robiłem źle). Jednak po dodaniu, app.run(host='0.0.0.0')jak wspomniano w innej odpowiedzi do mojego pliku serwera, mogłem uzyskać dostęp do strony w sieci. Czy ktoś jeszcze ma problem taki jak ten, który opisałem lub ma jakieś informacje na jego temat?
twknab
2
Dla mnie uruchomienie kolby --host = 0.0.0.0 rozwiązuje problem. Byłem w stanie uzyskać dostęp do adresu URL -http: // <adres ip>: 5000. Najpierw sprawdziłem, które porty są otwarte na komputerze za pomocą polecenia - sudo firewall-cmd --zone = public --list-porty, a potem dowiedziałem się, że port 5000 nie jest otwarty. Otworzyłem ten port za pomocą polecenia - sudo firewall-cmd --zone = public --permanent --add-port = 5000 / tcp, a następnie sudo firewall-cmd --reload. następnie uruchom aplikację kolby jako - uruchom kolbę - host = 0.0.0.0
Pintu Kumar
24

Spróbuj tego, jeśli metoda 0.0.0.0 nie działa

Nudne rzeczy

Dużo osobiście walczyłem, aby moja aplikacja była dostępna dla innych urządzeń (laptopów i telefonów komórkowych) za pośrednictwem lokalnego serwera. Próbowałem metody 0.0.0.0, ale bez powodzenia. Potem próbowałem zmienić port, ale to po prostu nie działało. Tak więc, po wypróbowaniu kilku różnych kombinacji, doszedłem do tego i rozwiązało to mój problem z wdrożeniem mojej aplikacji na serwerze lokalnym.

Kroki

  1. Uzyskaj lokalny adres IPv4 swojego komputera. Można to zrobić, pisząc ipconfigw systemie Windows, ifconfigLinux i Mac.

IPv4 (Windows)

Uwaga: powyższy krok należy wykonać na komputerze, na którym aplikacja jest obsługiwana, a nie na komputerze, na którym uzyskujesz do niej dostęp. Należy również pamiętać, że adres IPv4 może ulec zmianie, jeśli odłączysz się i ponownie połączysz z siecią.

  1. Teraz wystarczy uruchomić aplikację kolby z uzyskanym adresem IPv4.

    flask run -h 192.168.X.X

    Np. W moim przypadku (patrz zdjęcie) uruchomiłem go jako:

    flask run -h 192.168.1.100

uruchomienie aplikacji kolby

Na moim urządzeniu mobilnym

zrzut ekranu z mojego telefonu komórkowego

Opcjonalne rzeczy

Jeśli wykonujesz tę procedurę w systemie Windows i używasz Power Shell jako interfejsu CLI, a nadal nie możesz uzyskać dostępu do witryny, wypróbuj polecenie CTRL + C w powłoce, w której działa aplikacja. Power Shell czasami się zamarza i potrzebuje ożywienia, by ożywić. Może to nawet zakończyć serwer, ale czasem to rozwiązuje.

Otóż ​​to. Poddaj kciuki, jeśli uznasz to za pomocne

Więcej opcjonalnych rzeczy

Stworzyłem krótki skrypt Powershell, który dostarczy ci twój adres IP, gdy tylko będziesz go potrzebować:

$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

Zapisz go w pliku z rozszerzeniem .ps1 (dla PowerShell) i uruchom go przed uruchomieniem aplikacji. Możesz zapisać go w folderze projektu i uruchomić jako:

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

Uwaga: Zapisałem powyższy kod powłoki w getIP.ps1.

Cool.👌

nwillo
źródło
1
Tak! to działa. mogę go uruchomić na moim telefonie komórkowym, ustawiając ipv4 ip na flask. mam nadzieję, że to też pomoże innym :)
Ashu Kumar
@nwillo do mobile, a komputer, na którym służę, jest podłączony do tej samej sieci Wi-Fi /.
sachin rathod
@sachinrathod tak. muszą. W ten sposób mogą uzyskać dostęp do tej samej bramy IP.
nwillo
22

Jeśli Twoja coolaplikacja ma konfigurację załadowaną z zewnętrznego pliku, jak w poniższym przykładzie, nie zapomnij zaktualizować odpowiedniego pliku konfiguracyjnego za pomocą HOST = „0.0.0.0”

cool.app.run(
    host=cool.app.config.get("HOST", "localhost"),
    port=cool.app.config.get("PORT", 9000)
)            
mircealungu
źródło
1
Jest to dobry sposób na przechowywanie nazwy hosta i numeru portu w konfiguracji kolby. Szukałem właśnie tego rozwiązania.
konkurs
20

Dodaj poniższe wiersze do swojego projektu

if __name__ == '__main__':
    app.debug = True
    app.run(host = '0.0.0.0',port=5005)
Jeevan Chaitanya
źródło
DostajęOSError: [WinError 10013] An attempt was made to access a socket in a way forbidden by its access permissions
pyd
Aby naprawić, musisz uruchomić plik python z uruchomionym jako administrator i sprawdzić, czy w systemie Windows działa dowolny port netstat -na|findstr 5005.
Jeevan Chaitanya
10

Sprawdź, czy dany port jest otwarty na serwerze, aby obsługiwał klienta, czy nie?

w dystrybucji Ubuntu lub Linux

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

Skonfiguruj aplikację do obsługi zdalnych żądań

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


python3 app.py & #run application in background
Rajesh Prasad Yadav
źródło
5

Przejdź do ścieżki projektu na CMD (wiersz polecenia) i wykonaj następujące polecenie: -

ustaw FLASK_APP = ABC.py

SET FLASK_ENV = programowanie

uruchom kolbę -h [twójIP] -p 8080

dostaniesz następujące o / p na CMD: -

  • Aplikacja Serving Flask „expirement.py” (leniwe ładowanie)
    • Środowisko: rozwój
    • Tryb debugowania: włączony
    • Ponowne uruchomienie ze stat
    • Debuger jest aktywny!
    • Kod debugera: 199-519-700
    • Działa na http: // [twójIP]: 8080 / (Naciśnij CTRL + C, aby wyjść)

Teraz możesz uzyskać dostęp do aplikacji kolby na innym komputerze, używając http: // [twójIP]: 8080 / url

Ibz.Shaikh
źródło
4

Jeśli masz problemy z dostępem do serwera Flask, wdrożonego za pomocą PyCharm , weź pod uwagę następujące kwestie :

PyCharm nie uruchamia twojego głównego pliku .py bezpośrednio, więc żaden kod w nim if __name__ == '__main__':nie zostanie wykonany, a wszelkie zmiany (jak app.run(host='0.0.0.0', port=5000)) nie wejdą w życie.

Zamiast tego należy skonfigurować serwer Flask za pomocą opcji Uruchom konfiguracje, w szczególności umieszczając --host 0.0.0.0 --port 5000w polu Opcje dodatkowe .

Uruchom współtworzenie serwera Flask PyCharm

Więcej informacji o konfigurowaniu serwera Flask w PyCharm

Wiaczesław Z
źródło
To faktycznie rozwiązało wszystkie moje problemy i powinna być poprawną odpowiedzią na to pytanie!
Alberto Bellini
4

Dla mnie podążyłem za powyższą odpowiedzią i nieco ją zmodyfikowałem:

  1. Wystarczy pobrać adres IPv4 za pomocą ipconfig w wierszu polecenia
  2. Przejdź do pliku, w którym znajduje się kod kolby
  3. W głównej funkcji napisz app.run (host = „Twój adres IPv4”)

Na przykład:

wprowadź opis zdjęcia tutaj

Arsalan Fakhar
źródło
3

Miałem ten sam problem, używam PyCharm jako edytora, a kiedy tworzyłem projekt, PyCharm stworzył serwer Flask. Stworzyłem serwer z Pythonem w następujący sposób;

Skonfiguruj PyCharm Server Python w zasadzie to, co zrobiłem, to stworzenie nowego serwera, ale jeśli nie, to kolba

Mam nadzieję, że Ci to pomoże

Juanes30
źródło
Nie publikuj tylko obrazu - opisz szczegółowo, co robisz, aby rozwiązać problem.
CertainPerformance
Hej, oczywiście, jeśli już edytuję post, aby poprawić odpowiedź.
Juanes30
3

Ta odpowiedź nie dotyczy wyłącznie kolby, ale powinna mieć zastosowanie do wszystkich, którzy nie mogą połączyć usługi z innego problemu z hostem .

  1. użyj, netstat -ano | grep <port>aby sprawdzić, czy adres to 0.0.0.0 lub ::. Jeśli jest to 127.0.0.1, dotyczy to tylko żądań lokalnych.
  2. użyj tcpdump, aby sprawdzić, czy brakuje jakiegoś pakietu. Jeśli pokazuje oczywistą nierównowagę, sprawdź reguły routingu według iptables.

Dzisiaj uruchamiam aplikację flask jak zwykle, ale zauważyłem, że nie można połączyć się z innym serwerem. Następnie uruchamiam netstat -ano | grep <port>, a adres lokalny to ::lub 0.0.0.0(próbowałem obu i wiem, że 127.0.0.1 zezwala tylko na połączenie z lokalnego hosta). Potem użyłem telnet host port, wynik jest jak connect to .... To bardzo dziwne. Pomyślałem wtedy, że lepiej to sprawdzić tcpdump -i any port <port> -w w.pcap. Zauważyłem, że wszystko wygląda tak:

Wynik tcpdump pokazuje, że istnieją tylko pakiety SYN ze zdalnego hosta

Następnie, sprawdzając iptables --listsekcję WYJŚCIE, zobaczyłem kilka zasad:

wynik listy iptables

zasady te zabraniają wysyłania ważnych pakietów tcp podczas uzgadniania. Po ich usunięciu problem zniknął.

Tiina
źródło
1

przejdź do zestawu ścieżek projektu FLASK_APP = ABC.py SET FLASK_ENV = programowanie

uruchom flask -h [twójIP] -p 8080 będziesz śledził o / p na CMD: - * Serving Flask app "expirement.py" (leniwe ładowanie) * Środowisko: programowanie * Tryb debugowania: włączony * Ponowne uruchamianie ze stat * Debugger jest aktywny ! * PIN debugera: 199-519-700 * Działa na http: // [twójIP]: 8080 / (Naciśnij CTRL + C, aby wyjść)

Ibz.Shaikh
źródło
1

Możesz także ustawić hosta (aby udostępnić go w sieci adresowi IP) i port za pomocą zmiennych środowiskowych.

$ 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

Zobacz Jak uzyskać wszystkie dostępne opcje poleceń, aby ustawić zmienne środowiskowe?

Everett Toews
źródło
1

Utwórz plik .flaskenvw katalogu głównym projektu.

Parametry w tym pliku to zwykle:

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

Jeśli masz środowisko wirtualne, aktywuj je i zrób pip install python-dotenv.

Ten pakiet będzie używał .flaskenvpliku, a zawarte w nim deklaracje będą automatycznie importowane między sesjami terminali.

To możesz zrobić flask run

Saurabh
źródło