Konfigurasikan server dev Flask agar terlihat di seluruh jaringan

444

Saya tidak yakin apakah ini khusus Flask, tetapi ketika saya menjalankan aplikasi dalam mode dev ( http://localhost:5000), saya tidak dapat mengaksesnya dari komputer lain di jaringan (dengan http://[dev-host-ip]:5000). Dengan Rails dalam mode dev, misalnya, itu berfungsi dengan baik. Saya tidak dapat menemukan dokumen tentang konfigurasi server dev Flask. Adakah yang harus dikonfigurasikan untuk mengaktifkan ini?

Sa125
sumber

Jawaban:

714

Meskipun ini mungkin, Anda tidak boleh menggunakan server dev Flask dalam produksi. Server Flask dev tidak dirancang untuk menjadi sangat aman, stabil, atau efisien. Lihat dokumen tentang penerapan solusi yang benar.


Tambahkan parameter ke app.run(). Secara default ini berjalan di localhost, ubah app.run(host= '0.0.0.0')untuk berjalan di alamat IP mesin Anda.

Didokumentasikan di situs Flask di bawah "Server Terlihat Eksternal" pada halaman Quickstart :

Server Terlihat Eksternal

Jika Anda menjalankan server, Anda akan melihat bahwa server hanya tersedia dari komputer Anda sendiri, bukan dari yang lain dalam jaringan. Ini adalah default karena dalam mode debugging pengguna aplikasi dapat mengeksekusi kode Python sewenang-wenang di komputer Anda. Jika debug Anda dinonaktifkan atau memercayai pengguna di jaringan Anda, Anda dapat membuat server tersedia untuk umum.

Ubah saja panggilan run()metode untuk terlihat seperti ini:

app.run(host='0.0.0.0')

Ini memberi tahu sistem operasi Anda untuk mendengarkan pada IP publik.

Shawn Swaner
sumber
44
Untuk mengatur ke app.run ip tertentu (host = "192.168.1.7", port = 5010) berguna jika pc Anda memiliki beberapa ip
lxx
2
cara mengakses skrip flask secara global, hosting di server saya sendiri
pyd
Solusi ini juga berfungsi untuk wadah Docker. Posting ini menjelaskan solusi untuk kasus-kasus ini.
untuk mac: Saya tidak bisa mengakses aplikasi labu saya di 0.0.0.0 (meskipun disajikan di sana), kecuali dengan menargetkan domain yang ditentukan dalam System Preferences> Sharing . Domainnya harus seperti mymacname.local.
Nico Cernek
14
Entah bagaimana di Mac saya, saya harus menggunakan secara eksplisit flask run --host 0.0.0.0untuk membuatnya bekerja.
Minh Nghĩa
122

Jika Anda menggunakan termos yang dapat dijalankan untuk memulai server Anda, Anda dapat menggunakan flask run --host=0.0.0.0untuk mengubah default dari 127.0.0.1 dan membukanya ke koneksi non lokal. Metode config dan app.run yang dijelaskan oleh jawaban lain mungkin merupakan praktik yang lebih baik tetapi ini bisa berguna juga.

Server Terlihat Eksternal Jika Anda menjalankan server, Anda akan melihat bahwa server hanya dapat diakses dari komputer Anda sendiri, bukan dari yang lain dalam jaringan. Ini adalah default karena dalam mode debugging pengguna aplikasi dapat mengeksekusi kode Python sewenang-wenang di komputer Anda.

Jika Anda menonaktifkan debugger atau mempercayai pengguna di jaringan Anda, Anda dapat membuat server tersedia untuk umum hanya dengan menambahkan --host = 0.0.0.0 ke baris perintah:

flask run --host = 0.0.0.0 Ini memberitahu sistem operasi Anda untuk mendengarkan semua IP publik.

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

Aria
sumber
2
Saya tidak tahu apakah ada orang lain yang pernah mengalaminya, tetapi saya mencoba metode ini terlebih dahulu sesuai dengan dokumen QuickStart, tetapi untuk beberapa alasan aneh IP tetap berjalan di 127.0.0.1(saya mengatur Flask saya dieksekusi dengan benar, atau sepertinya, tidak yakin apa yang saya lakukan salah). Namun, setelah menambahkan app.run(host='0.0.0.0')sebagaimana dicatat dalam jawaban lain ke file server saya, saya dapat mengakses halaman di seluruh jaringan. Adakah orang lain yang memiliki masalah seperti yang saya jelaskan atau mempunyai info tentangnya?
twknab
2
Bagi saya, jalankan flask --host = 0.0.0.0 selesaikan masalah ini. Saya dapat mengakses url -http: // <alamat ip>: 5000. Pertama saya memeriksa port apa yang terbuka pada mesin dengan menggunakan perintah - sudo firewall-cmd --zone = public --list-ports, kemudian saya mengetahui bahwa port 5000 tidak terbuka. Saya membuka port ini menggunakan perintah - sudo firewall-cmd --zone = publik --permanent --add-port = 5000 / tcp diikuti oleh sudo firewall-cmd --reload. kemudian, jalankan aplikasi flask as - flask run --host = 0.0.0.0
Pintu Kumar
25

Coba ini jika metode 0.0.0.0 tidak berfungsi

Hal-hal yang Membosankan

Saya pribadi banyak berjuang untuk mendapatkan aplikasi saya dapat diakses oleh perangkat lain (laptop dan ponsel) melalui server lokal. Saya mencoba metode 0.0.0.0, tetapi tidak berhasil. Lalu saya mencoba mengubah port, tetapi tidak berhasil. Jadi, setelah mencoba banyak kombinasi yang berbeda, saya tiba di yang ini, dan itu memecahkan masalah saya menyebarkan aplikasi saya di server-lokal.

Langkah

  1. Dapatkan alamat IPv4 lokal komputer Anda. Ini dapat dilakukan dengan mengetik ipconfigdi Windows dan ifconfigdi linux dan Mac.

IPv4 (Windows)

Harap dicatat: Langkah di atas harus dilakukan pada mesin tempat Anda menjalankan aplikasi, dan bukan pada mesin tempat Anda mengaksesnya. Perhatikan juga, bahwa alamat IPv4 dapat berubah jika Anda memutuskan dan menyambung kembali ke jaringan.

  1. Sekarang, cukup jalankan aplikasi labu dengan alamat IPv4 yang diperoleh.

    flask run -h 192.168.X.X

    Misalnya dalam kasus saya (lihat gambar), saya menjalankannya sebagai:

    flask run -h 192.168.1.100

menjalankan aplikasi labu

Di perangkat seluler saya

tangkapan layar dari ponsel saya

Barang opsional

Jika Anda melakukan prosedur ini pada Windows, dan menggunakan Power Shell sebagai CLI, dan Anda masih tidak dapat mengakses situs web, coba perintah CTRL + C di shell yang menjalankan aplikasi. Power Shell terkadang membeku dan perlu sedikit pemulihan. Melakukan ini bahkan mungkin menghentikan server, tetapi kadang-kadang berhasil.

Itu dia. Berikan jempol jika Anda menemukan ini membantu

Beberapa hal opsional lainnya

Saya telah membuat skrip Powershell singkat yang akan memberi Anda alamat IP Anda kapan pun Anda membutuhkannya:

$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

Simpan ke file dengan extenstion .ps1 (untuk PowerShell), dan jalankan sebelum memulai aplikasi Anda. Anda dapat menyimpannya di folder proyek Anda dan menjalankannya sebagai:

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

Catatan: Saya menyimpan kode shell di atas di getIP.ps1.

Keren

tidak akan
sumber
1
ya! berhasil. Saya bisa mendapatkannya di ponsel saya dengan mengatur ipv4 ip ke termos. semoga itu juga membantu yang lain :)
Ashu Kumar
@nwillo do mobile dan mesin yang saya layani terhubung ke wifi / jaringan yang sama.
sachin rathod
@sachinatau ya. mereka harus. Begitulah cara mereka dapat mengakses gateway IP yang sama.
nwillo
22

Jika coolaplikasi Anda memiliki konfigurasi dimuat dari file eksternal, seperti dalam contoh berikut, maka jangan lupa untuk memperbarui file konfigurasi yang sesuai dengan HOST = "0.0.0.0"

cool.app.run(
    host=cool.app.config.get("HOST", "localhost"),
    port=cool.app.config.get("PORT", 9000)
)            
mircealungu
sumber
1
Ini adalah cara yang bagus untuk juga menyimpan nama host dan portnumber dalam konfigurasi flask. Saya sedang mencari solusi ini.
compie
20

Tambahkan baris di bawah ini ke proyek Anda

if __name__ == '__main__':
    app.debug = True
    app.run(host = '0.0.0.0',port=5005)
Jeevan Chaitanya
sumber
Saya mulaiOSError: [WinError 10013] An attempt was made to access a socket in a way forbidden by its access permissions
pyd
Untuk cara-cara memperbaiki Anda perlu menjalankan file python dengan run as administrator dan memeriksa port apa pun yang berjalan di windows netstat -na|findstr 5005.
Jeevan Chaitanya
10

Periksa apakah port tertentu terbuka di server untuk melayani klien atau tidak?

di distro Ubuntu atau Linux

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

Konfigurasikan aplikasi untuk menangani permintaan jarak jauh

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


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

Pergi ke jalur proyek Anda di CMD (command Prompt) dan jalankan perintah berikut: -

atur FLASK_APP = ABC.py

SET FLASK_ENV = pengembangan

flask run -h [yourIP] -p 8080

Anda akan mendapatkan o / p berikut di CMD: -

  • Melayani aplikasi Flask "expirement.py" (pemuatan malas)
    • Lingkungan: pembangunan
    • Mode debug: aktif
    • Restart dengan stat
    • Debugger aktif!
    • PIN Debugger: 199-519-700
    • Berjalan di http: // [yourIP]: 8080 / (Tekan CTRL + C untuk keluar)

Sekarang Anda dapat mengakses aplikasi labu di komputer lain menggunakan http: // [yourIP]: 8080 / url

Ibz.Shaikh
sumber
4

Jika Anda kesulitan mengakses server Flask Anda, yang digunakan menggunakan PyCharm , pertimbangkan hal-hal berikut:

PyCharm tidak menjalankan file .py utama Anda secara langsung, sehingga kode apa pun di if __name__ == '__main__':tidak akan dieksekusi, dan perubahan apa pun (seperti app.run(host='0.0.0.0', port=5000)) tidak akan berpengaruh.

Sebagai gantinya, Anda harus mengkonfigurasi server Flask menggunakan Run Configurations, khususnya, menempatkan --host 0.0.0.0 --port 5000ke dalam bidang opsi tambahan .

Jalankan kofigurasi server Flask PyCharm

Lebih lanjut tentang mengkonfigurasi server Flask di PyCharm

Viacheslav Z
sumber
Ini sebenarnya menyelesaikan semua masalah saya dan harus menjadi jawaban yang benar untuk pertanyaan ini!
Alberto Bellini
4

Bagi saya saya mengikuti jawaban di atas dan sedikit memodifikasinya:

  1. Ambil saja alamat ipv4 Anda menggunakan ipconfig pada command prompt
  2. Buka file yang berisi kode flask
  3. Dalam fungsi utama tulis app.run (host = 'alamat ipv4 Anda')

Misalnya:

masukkan deskripsi gambar di sini

Arsalan Fakhar
sumber
3

Saya memiliki masalah yang sama, saya menggunakan PyCharm sebagai editor dan ketika saya membuat proyek, PyCharm menciptakan Server Flask. Apa yang saya lakukan adalah membuat server dengan Python dengan cara berikut;

Config Python Server PyCharm pada dasarnya yang saya lakukan adalah membuat server baru tetapi labu jika bukan python

Saya harap ini membantu Anda

Juanes30
sumber
Tolong jangan hanya memposting gambar - jelaskan secara khusus apa yang Anda lakukan yang menyelesaikan masalah.
Kinerja Tertentu
Hai, tentu saja jika saya sudah mengedit posting untuk meningkatkan jawabannya.
Juanes30
3

Jawaban ini tidak hanya terkait dengan labu, tetapi harus berlaku untuk semua yang tidak dapat menghubungkan layanan dari masalah host lainnya .

  1. gunakan netstat -ano | grep <port>untuk melihat apakah alamatnya 0.0.0.0 atau ::. Jika 127.0.0.1 maka hanya untuk permintaan lokal.
  2. gunakan tcpdump untuk melihat apakah ada paket yang hilang. Jika itu menunjukkan ketidakseimbangan yang jelas, periksa aturan routing oleh iptables.

Hari ini saya menjalankan aplikasi labu saya seperti biasa, tetapi saya perhatikan itu tidak dapat terhubung dari server lain. Kemudian saya jalankan netstat -ano | grep <port>, dan alamat lokal adalah ::atau 0.0.0.0(saya mencoba keduanya, dan saya tahu 127.0.0.1 hanya memungkinkan koneksi dari host lokal). Kemudian saya menggunakan telnet host port, hasilnya seperti connect to .... Ini sangat aneh. Maka saya pikir saya akan lebih baik memeriksanya tcpdump -i any port <port> -w w.pcap. Dan saya perhatikan semuanya seperti ini:

Hasil tcpdump menunjukkan bahwa hanya ada paket SYN dari host jarak jauh

Kemudian dengan memeriksa iptables --listbagian OUTPUT, saya dapat melihat beberapa aturan:

hasil daftar iptables

aturan-aturan ini melarang paket-paket penting tcp keluaran dalam jabat tangan. Dengan menghapusnya, masalahnya hilang.

Tiina
sumber
1

pergi ke path proyek set FLASK_APP = ABC.py SET FLASK_ENV = pengembangan

run labu -h [yourIP] -p 8080 Anda akan mengikuti o / p di CMD: - * Melayani aplikasi Labu "expirement.py" (pemuatan malas) * Lingkungan: pengembangan * Mode debug: aktif * Memulai ulang dengan stat * Debugger aktif ! * PIN Debugger: 199-519-700 * Berjalan di http: // [yourIP]: 8080 / (Tekan CTRL + C untuk keluar)

Ibz.Shaikh
sumber
1

Anda juga dapat mengatur host (untuk mengeksposnya pada jaringan yang menghadap alamat IP) dan port melalui variabel lingkungan.

$ 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

Lihat Bagaimana cara mendapatkan semua Opsi Perintah yang tersedia untuk mengatur variabel lingkungan?

Everett Toews
sumber
1

Buat file .flaskenvdi direktori root proyek.

Parameter dalam file ini biasanya:

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

Jika Anda memiliki lingkungan virtual, aktifkan dan lakukan a pip install python-dotenv.

Paket ini akan menggunakan .flaskenvfile, dan deklarasi di dalamnya akan diimpor secara otomatis di seluruh sesi terminal.

Maka Anda bisa melakukannya flask run

Saurabh
sumber