Flask dev sunucusunu ağda görünür olacak şekilde yapılandırma


443

Bunun Flask'a özel olduğundan emin değilim, ancak bir uygulamayı dev modunda ( http://localhost:5000) çalıştırdığımda , ağdaki diğer makinelerden (ile http://[dev-host-ip]:5000) erişemiyorum . Örneğin Ra modundaki Rails ile iyi çalışıyor. Flask dev sunucu yapılandırmasıyla ilgili herhangi bir doküman bulamadım. Bunu etkinleştirmek için neyin yapılandırılması gerektiği hakkında bir fikrin var mı?

Yanıtlar:


713

Bu mümkün olsa da, Flask dev sunucusunu üretimde kullanmamalısınız. Flask dev sunucusu, özellikle güvenli, kararlı veya verimli olacak şekilde tasarlanmamıştır. Üzerinde doküman Bkz dağıtma doğru çözümler için.


Cihazınıza bir parametre ekleyin app.run(). Varsayılan olarak localhost üzerinde çalışır, app.run(host= '0.0.0.0')makinelerinizin IP adresinde çalışacak şekilde değiştirin .

Flesk sitesinde Hızlı Başlangıç ​​sayfasında "Harici Olarak Görünür Sunucu" altında belgelenmiştir :

Harici Olarak Görünür Sunucu

Sunucuyu çalıştırırsanız, sunucunun ağdaki diğer bilgisayarlardan değil, yalnızca kendi bilgisayarınızdan kullanılabilir olduğunu göreceksiniz. Hata ayıklama modunda, uygulamanın bir kullanıcısı bilgisayarınızda rasgele Python kodu çalıştırabildiğinden bu öntanımlıdır. Hata ayıklamayı devre dışı bıraktıysanız veya ağınızdaki kullanıcılara güveniyorsanız, sunucuyu herkese açık hale getirebilirsiniz.

Sadece run()yöntemin çağrısını aşağıdaki gibi görünecek şekilde değiştirin :

app.run(host='0.0.0.0')

Bu, işletim sisteminize genel bir IP dinlemesini söyler.


44
Bilgisayarınızda birkaç ip varsa kullanışlı bir ip app.run (host = "192.168.1.7", port = 5010) ayarlamak için
lxx

2
flask betiğine global olarak nasıl
erişilir,

Bu çözüm Docker kapları için de geçerlidir. Bu yazı , bu vakaların çözümünü açıklamaktadır.

mac için: Sistem Tercihleri> Paylaşım'da belirtilen alan adını hedeflemek dışında, şişe uygulamama 0.0.0.0'da erişemedim (orada sunulmuş olmasına rağmen) . Alan adı gibi bir şey olmalıdır mymacname.local.
Nico Cernek

14
Bir şekilde Mac'imde çalışmasını sağlamak için açıkça kullanmam flask run --host 0.0.0.0gerekiyor.
Minh Nghĩa

122

Sunucunuzu başlatmak için şişe yürütülebilir dosyasını kullanırsanız flask run --host=0.0.0.0, varsayılanı 127.0.0.1'den değiştirmek ve yerel olmayan bağlantılara açmak için kullanabilirsiniz. Diğer cevapların açıkladığı config ve app.run yöntemleri muhtemelen daha iyi uygulamalardır, ancak bu da kullanışlı olabilir.

Harici Olarak Görünür Sunucu Sunucuyu çalıştırırsanız, sunucunun ağdaki diğer bilgisayarlardan değil, yalnızca kendi bilgisayarınızdan erişilebilir olduğunu fark edeceksiniz. Hata ayıklama modunda, uygulamanın bir kullanıcısı bilgisayarınızda rasgele Python kodu çalıştırabildiğinden bu öntanımlıdır.

Hata ayıklayıcıyı devre dışı bıraktıysanız veya ağınızdaki kullanıcılara güveniyorsanız, komut satırına --host = 0.0.0.0 ekleyerek sunucuyu herkese açık hale getirebilirsiniz:

flask run --host = 0.0.0.0 Bu, işletim sisteminize tüm genel IP'leri dinlemesini söyler.

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


2
Başkasının yaşayıp yaşamadığını bilmiyorum, ama önce QuickStart belgelerine göre bu yöntemi denedim, ancak bazı garip nedenlerden dolayı IP'nin çalışmaya devam etmesini 127.0.0.1sağladım (Şişemi çalıştırılabilirimi düzgün şekilde ayarladım, ya da öyle görünmüyordu) eminim ki yanlış yaptığım şey). Ancak, app.run(host='0.0.0.0')sunucu dosyama başka bir yanıtta belirtildiği gibi ekledikten sonra , ağlar üzerinden sayfaya erişebildim. Başka birinin açıkladığım gibi bir sorunu var mı veya herhangi bir bilgisi var mı?
twknab

2
Benim için flask run --host = 0.0.0.0 sorunu çözdü. Url -http: // <ip adresi>: 5000'e erişebildim. Önce komutta sudo bağlantı noktalarının ne olduğunu kontrol ettim - sudo firewall-cmd --zone = public --list-ports, sonra 5000 numaralı bağlantı noktasının açık olmadığını öğrendim. Bu bağlantı noktasını command - sudo firewall-cmd --zone = public --permanent --add-port = 5000 / tcp komutunu ve ardından sudo firewall-cmd --reload komutunu kullanarak açtım. sonra, flask uygulamasını şu şekilde çalıştırın - flask run --host = 0.0.0.0
Pintu Kumar

24

0.0.0.0 yöntemi işe yaramazsa bunu deneyin

Sıkıcı şeyler

Uygulamamın yerel bir sunucu aracılığıyla diğer cihazlara (dizüstü bilgisayarlar ve cep telefonları) erişilebilir olmasını sağlamak için şahsen çok uğraştım. 0.0.0.0 yöntemini denedim, ama şans yok. Sonra limanı değiştirmeyi denedim, ama işe yaramadı. Bu yüzden, farklı kombinasyonları denedikten sonra, bu kombinasyona geldim ve uygulamamı yerel bir sunucuya dağıtma sorunumu çözdü.

adımlar

  1. Bilgisayarınızın yerel IPv4 adresini alın. Bu, ipconfigWindows'a ve ifconfiglinux ve Mac'e yazılarak yapılabilir .

IPv4 (Windows)

Lütfen dikkat: Yukarıdaki adım, uygulamaya hizmet verdiğiniz makinede ve eriştiğiniz makinede gerçekleştirilmeyecektir. Ayrıca, ağ bağlantısını kesip yeniden bağlanırsanız IPv4 adresinin değişebileceğini unutmayın.

  1. Şimdi, flask uygulamasını edinilen IPv4 adresiyle çalıştırın.

    flask run -h 192.168.X.X

    Örneğin Benim durumumda (resme bakın), şu şekilde çalıştırdım:

    flask run -h 192.168.1.100

flask uygulamasını çalıştırma

Mobil cihazımda

cep telefonumdan ekran görüntüsü

İsteğe Bağlı Öğeler

Bu yordamı Windows'ta gerçekleştiriyorsanız ve Power Shell'i CLI olarak kullanıyorsanız ve yine de web sitesine erişemiyorsanız, uygulamayı çalıştıran kabukta bir CTRL + C komutunu deneyin. Power Shell bazen donar ve canlanması için bir tutam gerekir. Bunu yapmak sunucuyu sonlandırabilir, ancak bazen hile yapar.

Bu kadar. Bunu faydalı bulduysanız bir başparmak verin.

Bazı isteğe bağlı şeyler

İhtiyacınız olduğunda IP adresinizi alacak kısa bir Powershell betiği oluşturdum:

$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

.Ps1 extenstion (PowerShell için) içeren bir dosyaya kaydedin ve uygulamanızı başlatmadan önce çalıştırın. Proje klasörünüze kaydedebilir ve şu şekilde çalıştırabilirsiniz:

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

Not: Yukarıdaki kabuk kodunu getIP.ps1 dosyasına kaydettim.

Cool.👌


1
Evet! işe yarıyor. im cep telefonuna ipv4 ip şişeye ayarlayarak almak mümkün. umarım diğer de yardımcı olur :)
Ashu Kumar

@nwillo mobil yapmak ve hizmet verdiğim makine aynı wifi / ağa bağlı.
sachin rathod

@sachinrathod evet. onlar zorunda. Aynı IP ağ geçidine bu şekilde erişebilirler.
nwillo

22

Senin Eğer cooluygulama 's yapılandırma Harici bir dosyadan yüklendikten gibi aşağıdaki örnekte, daha sonra = "0.0.0.0" HOST ile ilgili yapılandırma dosyasını güncelleştirmek unutmayın

cool.app.run(
    host=cool.app.config.get("HOST", "localhost"),
    port=cool.app.config.get("PORT", 9000)
)            

1
Bu, ana makine adını ve portnumber'ı şişe yapılandırmasında depolamanın güzel bir yoludur. Tam olarak bu çözümü arıyordum.
compie

20

Projenize aşağıdaki satırları ekleyin

if __name__ == '__main__':
    app.debug = True
    app.run(host = '0.0.0.0',port=5005)

Ben alıyorumOSError: [WinError 10013] An attempt was made to access a socket in a way forbidden by its access permissions
pyd

Düzeltmek için Python dosyasını yönetici olarak çalıştır ile çalıştırmanız ve pencerelerde herhangi bir bağlantı noktasının çalışıp çalışmadığını kontrol etmeniz gerekir netstat -na|findstr 5005.
Jeevan Chaitanya

10

İstemciye hizmet etmek için sunucuda belirli bir bağlantı noktasının açık olup olmadığını kontrol ettiniz mi?

Ubuntu veya Linux dağıtımında

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

Uygulamayı uzak istekleri işleyecek şekilde yapılandırma

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


python3 app.py & #run application in background

5

CMD'deki (komut İstemi) proje yolunuza gidin ve aşağıdaki komutu yürütün: -

set FLASK_APP = ABC.py

SET FLASK_ENV = geliştirme

flask koşusu -h [yourIP] -p 8080

CMD'de şu p / p alacaksınız: -

  • Flask uygulaması "expirement.py" sunuluyor (tembel yükleme)
    • Çevre: gelişme
    • Hata ayıklama modu: açık
    • Stat ile yeniden başlatılıyor
    • Hata ayıklayıcı etkin!
    • Hata ayıklayıcı PIN'i: 199-519-700
    • Koşu http: // [yourIP]: 8080 / (CTRL + C çıkmak için)

Artık http: // [yourIP]: 8080 / url'yi kullanarak başka bir makineden şişe uygulamanıza erişebilirsiniz.


4

PyCharm kullanılarak dağıtılan Flask sunucunuza erişimde sorun yaşıyorsanız , aşağıdakileri dikkate alın:

PyCharm ana .py dosyanızı doğrudan çalıştırmaz, bu nedenle içindeki herhangi bir kod if __name__ == '__main__':yürütülmez ve değişiklikler (gibi app.run(host='0.0.0.0', port=5000)) geçerli olmaz.

Bunun yerine, yerleştirme, özellikle, Çalıştır Yapılandırmaları kullanarak Matara sunucusu yapılandırmak gerekir --host 0.0.0.0 --port 5000içine ek seçenekler alanında.

Flask sunucusu PyCharm'ın yapılandırmalarını çalıştırın

PyCharm'da Flask sunucusunu yapılandırma hakkında daha fazla bilgi


Bu aslında tüm sorunlarımı çözdü ve bu sorunun doğru cevabı olmalı!
Alberto Bellini

4

Benim için yukarıdaki cevabı takip ettim ve biraz değiştirdim:

  1. Sadece komut isteminde ipconfig kullanarak ipv4 adresinizi alın
  2. Şişe kodunun bulunduğu dosyaya gidin
  3. Ana işlevde app.run yazın (host = 'ipv4 adresiniz')

Örneğin:

resim açıklamasını buraya girin


3

Aynı sorunu yaşadım, bir editör olarak PyCharm kullanıyorum ve projeyi oluşturduğumda PyCharm bir Flask Sunucusu oluşturdu. Yaptığım şey şu şekilde Python ile bir sunucu oluşturmaktı;

Python Sunucusu PyCharm'ı Yapılandırma temelde ne yaptım yeni bir sunucu oluşturmak ama python değilse flask oldu

Umarım sana yardımcı olur


Lütfen sadece bir resim yayınlamayın; sorunu çözen özellikle ne yaptığınızı açıklayın.
CertainPerformance

Hey, tabii ki cevabı geliştirmek için yazıyı zaten düzenliyorsam.
Juanes30

3

Bu yanıt yalnızca şişeyle ilgili değildir, ancak başka bir ana bilgisayar sorunundan hizmeti bağlayamayan herkes için geçerli olmalıdır .

  1. kullanım netstat -ano | grep <port> adres :: 0.0.0.0 veya olup olmadığını görmek için. 127.0.0.1 ise, yalnızca yerel istekler içindir.
  2. herhangi bir paketin eksik olup olmadığını görmek için tcpdump kullanın. Belirgin bir dengesizlik gösteriyorsa, yönlendirme kurallarını iptables ile kontrol edin.

Bugün benim flask uygulamasını her zamanki gibi çalıştırıyorum, ancak diğer sunucudan bağlanamayacağını fark ettim. Sonra çalıştırın netstat -ano | grep <port>ve yerel adres ::veya 0.0.0.0(Her ikisini de denedim ve 127.0.0.1 sadece yerel ana bilgisayardan bağlantıya izin verir biliyorum). Sonra kullandım telnet host port, sonuç gibi connect to .... Bu çok garip. Sonra kontrol etsen iyi olur tcpdump -i any port <port> -w w.pcap. Ve her şeyin böyle olduğunu fark ettim:

tcpdump sonucu uzak ana bilgisayardan yalnızca SYN paketleri olduğunu gösterir

Sonra iptables --listÇIKTI bölümünü kontrol ederek , birkaç kural görebiliyordum:

iptables listesi sonucu

bu kurallar el sıkışmalarında çıkış tcp hayati paketleri yasaklar. Onları silerek sorun giderildi.


1

proje yol kümesine git FLASK_APP = ABC.py SET FLASK_ENV = geliştirme

flask run -h [yourIP] -p 8080'i CMD'de o / p izleyeceksiniz: - * Flask uygulaması "expirement.py" (tembel yükleme) * Ortam: geliştirme * Hata ayıklama modu: açık * stat ile yeniden başlatma * Hata ayıklayıcı etkin ! * Hata ayıklayıcı PIN kodu: 199-519-700 * http: // [yourIP]: 8080 / (Çıkış yapmak için CTRL + C tuşlarına basın)


1

Ayrıca ortam değişkenleri aracılığıyla ana bilgisayarı (IP adresine bakan bir ağda göstermek için) ve bağlantı noktasını da ayarlayabilirsiniz.

$ 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

Bkz ayarlanan ortam değişkenleri için mevcut tüm komut Seçenek nasıl alınır?


1

.flaskenvProje kök dizininde dosya oluşturun .

Bu dosyadaki parametreler genellikle:

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

Sanal bir ortamınız varsa, etkinleştirin ve bir pip install python-dotenv.

Bu paket .flaskenvdosyayı kullanacak ve içindeki bildirimler terminal oturumlarına otomatik olarak aktarılacaktır.

Sonra yapabilirsin flask run

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.