Cấu hình máy chủ dev Flask để hiển thị trên mạng


442

Tôi không chắc đây có phải là Flask cụ thể không, nhưng khi tôi chạy một ứng dụng ở chế độ dev ( http://localhost:5000), tôi không thể truy cập nó từ các máy khác trên mạng (có http://[dev-host-ip]:5000). Ví dụ, với Rails ở chế độ dev, nó hoạt động tốt. Tôi không thể tìm thấy bất kỳ tài liệu nào liên quan đến cấu hình máy chủ Flask dev. Bất kỳ ý tưởng những gì nên được cấu hình để kích hoạt điều này?

Câu trả lời:


712

Mặc dù điều này là có thể, nhưng bạn không nên sử dụng máy chủ Flask dev trong sản xuất. Máy chủ Flask dev không được thiết kế để đặc biệt an toàn, ổn định hoặc hiệu quả. Xem các tài liệu về triển khai cho các giải pháp chính xác.


Thêm một tham số cho của bạn app.run(). Theo mặc định, nó chạy trên localhost, thay đổi nó thànhapp.run(host= '0.0.0.0') để chạy trên địa chỉ IP của máy.

Tài liệu trên trang Flask trong "Máy chủ có thể nhìn thấy bên ngoài" trên trang Quickstart :

Máy chủ có thể nhìn thấy bên ngoài

Nếu bạn chạy máy chủ, bạn sẽ nhận thấy rằng máy chủ chỉ khả dụng từ máy tính của bạn chứ không phải từ bất kỳ máy chủ nào khác trong mạng. Đây là mặc định vì trong chế độ gỡ lỗi, người dùng ứng dụng có thể thực thi mã Python tùy ý trên máy tính của bạn. Nếu bạn đã gỡ lỗi hoặc tin tưởng người dùng trên mạng của mình, bạn có thể đặt máy chủ ở chế độ công khai.

Chỉ cần thay đổi cuộc gọi của run()phương thức để trông như thế này:

app.run(host='0.0.0.0')

Điều này cho hệ điều hành của bạn lắng nghe trên một IP công cộng.


44
Để thiết lập để một app.run ip cụ thể (host = "192.168.1.7", port = 5010) thuận tiện nếu máy của bạn có một vài ip của
LXX

2
Làm thế nào để truy cập tập lệnh bình trên toàn cầu, lưu trữ trên máy chủ của riêng tôi
pyd

Giải pháp này cũng hoạt động cho các container Docker. Đây bài mô tả các giải pháp cho những trường hợp này.

cho mac: Tôi không thể truy cập ứng dụng bình của mình tại 0.0.0.0 (mặc dù nó được phục vụ ở đó), ngoại trừ bằng cách nhắm mục tiêu tên miền được chỉ định trong Tùy chọn hệ thống> Chia sẻ . Tên miền nên là một cái gì đó như mymacname.local.
Nico Cernek

14
Bằng cách nào đó trên máy Mac của tôi, tôi phải sử dụng một cách rõ ràng flask run --host 0.0.0.0để làm cho nó hoạt động.
Minh Nghĩa

122

Nếu bạn sử dụng bình thực thi để khởi động máy chủ của mình, bạn có thể sử dụng flask run --host=0.0.0.0để thay đổi mặc định từ 127.0.0.1 và mở nó lên các kết nối không cục bộ. Các phương thức config và app.run mà các câu trả lời khác mô tả có thể thực hành tốt hơn nhưng điều này cũng có thể có ích.

Máy chủ có thể nhìn thấy bên ngoài Nếu bạn chạy máy chủ, bạn sẽ nhận thấy rằng máy chủ chỉ có thể truy cập được từ máy tính của bạn chứ không phải từ bất kỳ máy chủ nào khác trong mạng. Đây là mặc định vì trong chế độ gỡ lỗi, người dùng ứng dụng có thể thực thi mã Python tùy ý trên máy tính của bạn.

Nếu bạn đã gỡ lỗi hoặc tin tưởng người dùng trên mạng của mình, bạn có thể đặt máy chủ ở chế độ công khai đơn giản bằng cách thêm --host = 0.0.0.0 vào dòng lệnh:

jar chạy --host = 0.0.0.0 Điều này cho hệ điều hành của bạn lắng nghe trên tất cả các IP công cộng.

Tham khảo: http://flask.pocoo.org/docs/0.11/quickstart/


2
Tôi không biết có ai đã trải nghiệm nó chưa, nhưng tôi đã thử phương pháp này trước tiên theo các tài liệu QuickStart, nhưng vì một số lý do kỳ lạ mà IP vẫn chạy 127.0.0.1(Tôi thiết lập Flask thực thi đúng cách, hoặc có vẻ như vậy, không phải vậy chắc chắn những gì tôi đã làm sai). Tuy nhiên, sau khi thêm app.run(host='0.0.0.0')như đã lưu ý trong một câu trả lời khác vào tệp máy chủ của mình, tôi đã có thể truy cập trang trên các mạng. Bất cứ ai khác có một vấn đề như vấn đề tôi đã mô tả hoặc có bất kỳ thông tin nào về nó?
twknab

2
Đối với tôi, bình chạy --host = 0.0.0.0 giải quyết vấn đề. Tôi đã có thể truy cập url -http: // <địa chỉ ip>: 5000. Đầu tiên tôi kiểm tra các cổng được mở trên máy bằng lệnh - sudo tường lửa-cmd --zone = public --list-port, sau đó tôi biết rằng cổng 5000 không mở. Tôi đã mở cổng này bằng lệnh - sudo tường lửa-cmd --zone = public --permanent --add-port = 5000 / tcp theo sau là sudo tường lửa-cmd --reload. sau đó, chạy ứng dụng bình như - bình chạy --host = 0.0.0.0
Pintu Kumar

23

Hãy thử điều này nếu phương thức 0.0.0.0 không hoạt động

Thứ nhàm chán

Cá nhân tôi đã chiến đấu rất nhiều để ứng dụng của tôi có thể truy cập được vào các thiết bị khác (máy tính xách tay và điện thoại di động) thông qua một máy chủ cục bộ. Tôi đã thử phương pháp 0.0.0.0, nhưng không có may mắn. Sau đó, tôi đã thử thay đổi cổng, nhưng nó không hoạt động. Vì vậy, sau khi thử một loạt các kết hợp khác nhau, tôi đã tìm đến kết hợp này và nó đã giải quyết vấn đề của tôi khi triển khai ứng dụng của mình trên máy chủ cục bộ.

Các bước

  1. Lấy địa chỉ IPv4 cục bộ của máy tính của bạn. Điều này có thể được thực hiện bằng cách gõ ipconfigtrên Windows và ifconfigtrên linux và Mac.

IPv4 (Windows)

Xin lưu ý: Bước trên là được thực hiện trên máy bạn đang phục vụ ứng dụng và không phải trên máy bạn đang truy cập ứng dụng đó. Cũng lưu ý rằng địa chỉ IPv4 có thể thay đổi nếu bạn ngắt kết nối và kết nối lại với mạng.

  1. Bây giờ, chỉ cần chạy ứng dụng bình với địa chỉ IPv4 có được.

    flask run -h 192.168.X.X

    Ví dụ: Trong trường hợp của tôi (xem hình ảnh), tôi đã chạy nó dưới dạng:

    flask run -h 192.168.1.100

chạy ứng dụng bình

Trên thiết bị di động của tôi

ảnh chụp màn hình từ điện thoại di động của tôi

Công cụ tùy chọn

Nếu bạn đang thực hiện quy trình này trên Windows và sử dụng Power Shell làm CLI và bạn vẫn không thể truy cập trang web, hãy thử lệnh CTRL + C trong trình bao chạy ứng dụng. Power Shell đôi khi bị đóng băng và nó cần một nhúm để hồi sinh. Làm điều này thậm chí có thể chấm dứt máy chủ, nhưng đôi khi nó cũng có mẹo.

Đó là nó. Hãy giơ ngón tay cái lên nếu bạn thấy điều này hữu ích .😉

Một số công cụ tùy chọn khác

Tôi đã tạo một tập lệnh Powershell ngắn để lấy địa chỉ IP của bạn bất cứ khi nào bạn cần:

$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

Lưu nó vào một tệp có phần mở rộng .ps1 (cho PowerShell) và chạy nó trước khi bắt đầu ứng dụng của bạn. Bạn có thể lưu nó trong thư mục dự án của bạn và chạy nó dưới dạng:

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

Lưu ý: Tôi đã lưu mã shell ở trên trong getIP.ps1.

Thật tuyệt


1
vâng nó hoạt động tôi có thể tải nó lên trên điện thoại di động của mình bằng cách đặt ipv4 ip vào bình. hy vọng nó cũng giúp được người khác :)
Ashu Kumar

@nwillo làm di động và máy mà tôi phục vụ được kết nối với cùng wifi / mạng.
sachin rathod

@sachinrathod vâng. họ phải. Đó là cách họ có thể truy cập cùng một cổng IP.
nwillo

22

Nếu coolứng dụng của bạn có cấu hình được tải từ một tệp bên ngoài, như trong ví dụ sau, thì đừng quên cập nhật tệp cấu hình tương ứng với HOST = "0.0.0.0"

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

1
Đây là một cách hay để lưu trữ tên máy chủ và số cổng trong cấu hình bình. Tôi đã tìm kiếm chính xác giải pháp này.
compie

20

Thêm dòng dưới đây vào dự án của bạn

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

Tôi đang nhận đượcOSError: [WinError 10013] An attempt was made to access a socket in a way forbidden by its access permissions
pyd 2/218

Để khắc phục Bạn cần chạy tệp python với tư cách quản trị viên và kiểm tra xem có cổng nào đang chạy trên windows không netstat -na|findstr 5005.
Jeevan Chaitanya

10

Kiểm tra xem cổng cụ thể có được mở trên máy chủ để phục vụ khách hàng hay không?

trong bản phân phối Ubuntu hoặc Linux

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

Cấu hình ứng dụng để xử lý các yêu cầu từ xa

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


python3 app.py & #run application in background

5

Chuyển đến đường dẫn dự án của bạn trên CMD (lệnh Prompt) và thực hiện lệnh sau: -

đặt FLASK_APP = ABC.py

THIẾT LẬP FLASK_ENV = phát triển

bình chạy -h [yourIP] -p 8080

bạn sẽ nhận được o / p sau trên CMD: -

  • Phục vụ ứng dụng Flask "exporrow.py" (tải lười biếng)
    • Môi trường: phát triển
    • Chế độ gỡ lỗi: bật
    • Khởi động lại với stat
    • Trình gỡ lỗi đang hoạt động!
    • Mã gỡ lỗi: 199-519-700
    • Chạy trên http: // [yourIP]: 8080 / (Nhấn CTRL + C để thoát)

Bây giờ bạn có thể truy cập ứng dụng bình của mình trên một máy khác bằng http: // [yourIP]: 8080 / url


4

Nếu bạn gặp sự cố khi truy cập máy chủ Flask, hãy triển khai bằng PyCharm , hãy xem xét các điều sau:

PyCharm không chạy trực tiếp tệp .py chính của bạn, vì vậy mọi mã trong if __name__ == '__main__':sẽ không được thực thi và mọi thay đổi (như app.run(host='0.0.0.0', port=5000)) sẽ không có hiệu lực.

Thay vào đó, bạn nên định cấu hình máy chủ Flask bằng cách sử dụng Cấu hình Run, đặc biệt, đặt --host 0.0.0.0 --port 5000vào trường Tùy chọn bổ sung .

Chạy cofigurations của máy chủ Flask PyCharm

Tìm hiểu thêm về cách định cấu hình máy chủ Flask trong PyCharm


Điều này thực sự đã giải quyết tất cả các vấn đề của tôi và nên là câu trả lời chính xác cho câu hỏi này!
Alberto Bellini

3

Tôi gặp vấn đề tương tự, tôi sử dụng PyCharm làm biên tập viên và khi tôi tạo dự án, PyCharm đã tạo Flask Server. Những gì tôi đã làm là tạo một máy chủ với Python theo cách sau;

Cấu hình máy chủ Python PyCharm về cơ bản những gì tôi đã làm là tạo một máy chủ mới, nhưng nếu không phải là python

Tôi hy vọng nó sẽ giúp bạn


Xin đừng chỉ đăng một hình ảnh - mô tả cụ thể những gì bạn làm để giải quyết vấn đề.
SurePerformance

Hey, tất nhiên nếu tôi đã chỉnh sửa bài viết để cải thiện câu trả lời.
Juanes30

3

Câu trả lời này không chỉ liên quan đến bình, nhưng nên được áp dụng cho tất cả các dịch vụ không thể kết nối từ một vấn đề máy chủ khác .

  1. sử dụng netstat -ano | grep <port>để xem địa chỉ là 0.0.0.0 hay ::. Nếu nó là 127.0.0.1 thì nó chỉ dành cho các yêu cầu cục bộ.
  2. sử dụng tcpdump để xem có gói nào bị thiếu không. Nếu nó cho thấy sự mất cân bằng rõ ràng, hãy kiểm tra các quy tắc định tuyến bằng iptables.

Hôm nay tôi chạy ứng dụng bình của mình như bình thường, nhưng tôi nhận thấy nó không thể kết nối từ máy chủ khác. Sau đó, tôi chạy netstat -ano | grep <port>và địa chỉ cục bộ là ::hoặc 0.0.0.0(tôi đã thử cả hai và tôi biết 127.0.0.1 chỉ cho phép kết nối từ máy chủ cục bộ). Sau đó tôi sử dụng telnet host port, kết quả là như thế connect to .... Điều này rất kỳ quặc. Sau đó, tôi nghĩ rằng tôi sẽ kiểm tra nó tốt hơn với tcpdump -i any port <port> -w w.pcap. Và tôi nhận thấy tất cả đều như thế này:

Kết quả tcpdump cho thấy nó chỉ có các gói SYN từ máy chủ từ xa

Sau đó, bằng cách kiểm tra iptables --listphần OUTPUT, tôi có thể thấy một số quy tắc:

danh sách kết quả iptables

các quy tắc này cấm đầu ra tcp các gói quan trọng trong việc bắt tay. Bằng cách xóa chúng, vấn đề đã biến mất.


3

Đối với tôi, tôi đã làm theo câu trả lời ở trên và sửa đổi nó một chút:

  1. Chỉ cần lấy địa chỉ ipv4 của bạn bằng cách sử dụng ipconfig trên dấu nhắc lệnh
  2. Đi đến tập tin có mã bình
  3. Trong chức năng chính, hãy viết app.run (host = 'địa chỉ ipv4 của bạn')

Ví dụ:

nhập mô tả hình ảnh ở đây


1

đi tới đường dẫn dự án được đặt FLASK_APP = ABC.py SET FLASK_ENV = Development

chạy bình -h [yourIP] -p 8080, bạn sẽ theo dõi o / p trên CMD: - * Phục vụ ứng dụng Flask "expftime.py" (tải chậm) ! * Mã gỡ lỗi: 199-519-700 * Chạy trên http: // [yourIP]: 8080 / (Nhấn CTRL + C để thoát)


1

Bạn cũng có thể đặt máy chủ (để hiển thị trên mạng đối diện với địa chỉ IP) và cổng thông qua các biến môi trường.

$ 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

Xem Làm thế nào để có được tất cả các Tùy chọn lệnh có sẵn để đặt các biến môi trường?


1

Tạo tập tin .flaskenvtrong thư mục gốc của dự án.

Các tham số trong tệp này thường là:

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

Nếu bạn có một môi trường ảo, kích hoạt nó và làm một pip install python-dotenv.

Gói này sẽ sử dụng .flaskenvtệp và các khai báo bên trong nó sẽ được nhập tự động qua các phiên cuối.

Sau đó bạn có thể làm flask run

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.