กำหนดค่าเซิร์ฟเวอร์ dev ขวดเพื่อให้สามารถมองเห็นได้ทั่วทั้งเครือข่าย


443

ฉันไม่แน่ใจว่านี่เป็นเฉพาะของ Flask หรือไม่ แต่เมื่อฉันเรียกใช้แอพในโหมด dev ( http://localhost:5000) ฉันไม่สามารถเข้าถึงได้จากเครื่องอื่น ๆ บนเครือข่าย (ด้วยhttp://[dev-host-ip]:5000) ตัวอย่างเช่นด้วย Rails ในโหมด dev มันทำงานได้ดี ฉันไม่พบเอกสารใด ๆ เกี่ยวกับการกำหนดค่าเซิร์ฟเวอร์ dev ของ Flask มีความคิดใดที่ควรกำหนดค่าให้เปิดใช้งานสิ่งนี้

คำตอบ:


713

ในขณะนี้เป็นไปได้คุณไม่ควรใช้เซิร์ฟเวอร์ dev ขวดในการผลิต เซิร์ฟเวอร์ dev ของ Flask ไม่ได้รับการออกแบบให้มีความปลอดภัยมั่นคงหรือมีประสิทธิภาพเป็นพิเศษ ดูเอกสารเกี่ยวกับการปรับใช้สำหรับการแก้ปัญหาที่ถูกต้อง


app.run()เพิ่มพารามิเตอร์เพื่อคุณ โดยค่าเริ่มต้นมันทำงานบน localhost เปลี่ยนเป็นapp.run(host= '0.0.0.0')ทำงานบนที่อยู่ IP ของเครื่อง

จัดทำเอกสารบนไซต์ขวดใต้ "เซิร์ฟเวอร์ภายนอกที่มองเห็นได้" ในหน้า Quickstart :

เซิร์ฟเวอร์ที่มองเห็นจากภายนอก

หากคุณเรียกใช้เซิร์ฟเวอร์คุณจะสังเกตเห็นว่าเซิร์ฟเวอร์นั้นมีเฉพาะในคอมพิวเตอร์ของคุณเท่านั้นไม่ใช่จากเครือข่ายอื่น นี่เป็นค่าเริ่มต้นเนื่องจากในโหมดการดีบักผู้ใช้แอปพลิเคชันสามารถเรียกใช้งานโค้ด Python บนคอมพิวเตอร์ของคุณ หากคุณปิดใช้งานการดีบักหรือไว้วางใจผู้ใช้ในเครือข่ายของคุณคุณสามารถทำให้เซิร์ฟเวอร์พร้อมใช้งานแบบสาธารณะ

เพียงแค่เปลี่ยนการเรียกrun()เมธอดเป็นแบบนี้:

app.run(host='0.0.0.0')

สิ่งนี้บอกให้ระบบปฏิบัติการของคุณฟัง IP สาธารณะ


44
ในการตั้งค่าเป็น ip app.run เฉพาะ (โฮสต์ = "192.168.1.7", พอร์ต = 5010) มีประโยชน์ถ้าพีซีของคุณมี IP ไม่กี่ตัว
lxx

2
วิธีการเข้าถึงสคริปต์ขวดทั่วโลก, โฮสติ้งบนเซิร์ฟเวอร์ของฉันเอง
pyd

วิธีนี้ยังใช้ได้กับคอนเทนเนอร์ Docker ด้วย โพสต์นี้อธิบายถึงวิธีแก้ปัญหาสำหรับกรณีเหล่านี้

สำหรับ mac: ฉันไม่สามารถเข้าถึงแอปขวดของฉันที่ 0.0.0.0 (แม้ว่ามันจะถูกเสิร์ฟมี) ยกเว้นโดยการกำหนดเป้าหมายโดเมนที่ระบุไว้ในการตั้งค่าระบบ> การแชร์ โดเมนควรเป็นเช่นmymacname.localนั้น
Nico Cernek

14
ฉันต้องใช้อย่างชัดเจนflask run --host 0.0.0.0เพื่อให้มันใช้งานได้
Minh Nghĩa

122

หากคุณใช้ขวดปฏิบัติการเพื่อเริ่มต้นเซิร์ฟเวอร์ของคุณคุณสามารถใช้flask run --host=0.0.0.0เพื่อเปลี่ยนค่าเริ่มต้นจาก 127.0.0.1 และเปิดขึ้นเป็นการเชื่อมต่อที่ไม่ใช่ท้องถิ่น วิธีการตั้งค่าและ app.run ที่คำตอบอื่น ๆ อธิบายอาจเป็นแนวปฏิบัติที่ดีกว่า แต่ก็มีประโยชน์เช่นกัน

เซิร์ฟเวอร์ภายนอกที่มองเห็นได้หากคุณเรียกใช้เซิร์ฟเวอร์คุณจะสังเกตเห็นว่าเซิร์ฟเวอร์นั้นสามารถเข้าถึงได้จากคอมพิวเตอร์ของคุณเท่านั้นไม่ใช่จากเครือข่ายอื่น นี่เป็นค่าเริ่มต้นเนื่องจากในโหมดการดีบักผู้ใช้แอปพลิเคชันสามารถเรียกใช้งานโค้ด Python บนคอมพิวเตอร์ของคุณ

หากคุณปิดการใช้งานดีบักเกอร์หรือไว้วางใจผู้ใช้ในเครือข่ายของคุณคุณสามารถทำให้เซิร์ฟเวอร์สาธารณะได้ง่าย ๆ โดยเพิ่ม --host = 0.0.0.0 ในบรรทัดคำสั่ง:

flask run --host = 0.0.0.0 สิ่งนี้บอกให้ระบบปฏิบัติการของคุณฟัง IP สาธารณะทั้งหมด

การอ้างอิง: http://flask.pocoo.org/docs/0.11/quickstart/


2
ฉันไม่ทราบว่ามีคนอื่นประสบหรือไม่ แต่ฉันลองใช้วิธีนี้ก่อนตามเอกสาร QuickStart แต่ด้วยเหตุผลบางอย่างแปลก ๆ ที่ IP ยังคงทำงานอยู่127.0.0.1(ฉันตั้งค่า Flask ปฏิบัติการของฉันอย่างถูกต้องหรือดูเหมือนว่าไม่ใช่ แน่ใจในสิ่งที่ฉันทำผิด) อย่างไรก็ตามหลังจากเพิ่มapp.run(host='0.0.0.0')ตามที่ระบุไว้ในคำตอบอื่นในไฟล์เซิร์ฟเวอร์ของฉันฉันก็สามารถเข้าถึงหน้าเว็บในเครือข่าย ใครมีปัญหาเช่นเดียวกับที่ฉันได้อธิบายหรือมีข้อมูลใด ๆ เกี่ยวกับมัน?
twknab

2
สำหรับฉันใช้งานขวด - โฮสต์ = 0.0.0.0 แก้ไขปัญหา ฉันสามารถเข้าถึง url -http: // <ที่อยู่ ip>: 5000 ก่อนอื่นฉันตรวจสอบว่าพอร์ตใดที่เปิดอยู่บนเครื่องโดยใช้คำสั่ง - sudo firewall-cmd --zone = public --list-ports จากนั้นฉันก็รู้ว่าพอร์ต 5000 ไม่ได้เปิดอยู่ ฉันเปิดพอร์ตนี้โดยใช้คำสั่ง - sudo firewall-cmd --zone = public --permanent --add-port = 5,000 / tcp ตามด้วย sudo firewall-cmd - โหลด จากนั้นเรียกใช้แอพพลิเคชั่นขวด - วิ่งขวด - โฮสต์ = 0.0.0.0
Pintu Kumar

24

ลองใช้วิธีนี้ถ้าวิธี 0.0.0.0 ใช้ไม่ได้

สิ่งที่น่าเบื่อ

ฉันต่อสู้อย่างมากเพื่อให้แอปของฉันสามารถเข้าถึงอุปกรณ์อื่น ๆ (แล็ปท็อปและโทรศัพท์มือถือ) ผ่านเซิร์ฟเวอร์ภายใน ฉันลองใช้วิธี 0.0.0.0 แต่ไม่มีโชค จากนั้นฉันลองเปลี่ยนพอร์ต แต่มันไม่ทำงาน ดังนั้นหลังจากลองชุดค่าผสมที่แตกต่างกันฉันมาถึงชุดนี้และมันแก้ไขปัญหาของฉันในการปรับใช้แอพของฉันบนเซิร์ฟเวอร์ภายใน

ขั้นตอน

  1. รับที่อยู่ IPv4 ในเครื่องคอมพิวเตอร์ของคุณ สามารถทำได้โดยพิมพ์ipconfigบน Windows และifconfigบน linux และ Mac

IPv4 (Windows)

โปรดทราบ: ขั้นตอนข้างต้นจะต้องดำเนินการกับเครื่องที่คุณให้บริการแอพอยู่และไม่ใช่เครื่องที่คุณกำลังเข้าถึง โปรดทราบด้วยว่าที่อยู่ IPv4 อาจเปลี่ยนแปลงหากคุณตัดการเชื่อมต่อและเชื่อมต่อกับเครือข่ายอีกครั้ง

  1. ตอนนี้เพียงแค่เรียกใช้แอพพลิเคชั่นขวดด้วยที่อยู่ IPv4 ที่ได้รับ

    flask run -h 192.168.X.X

    เช่นในกรณีของฉัน (ดูภาพ) ฉันวิ่งตาม:

    flask run -h 192.168.1.100

เรียกใช้แอพพลิเคชั่นขวด

บนอุปกรณ์มือถือของฉัน

สกรีนช็อตจากโทรศัพท์มือถือของฉัน

สิ่งที่เป็นตัวเลือก

หากคุณทำตามขั้นตอนนี้ใน Windows และใช้ Power Shell เป็น CLI และคุณยังไม่สามารถเข้าถึงเว็บไซต์ให้ลองใช้คำสั่ง CTRL + C ในเชลล์ที่ใช้แอป Power Shell ติดขัดในบางครั้งและต้องการการบีบเพื่อชุบชีวิต การทำเช่นนี้อาจทำให้เซิร์ฟเวอร์หยุดทำงาน แต่บางครั้งก็เป็นการหลอกลวง

แค่นั้นแหละ. ยอมแพ้ถ้าคุณเห็นว่าสิ่งนี้มีประโยชน์😉

บางสิ่งเพิ่มเติมเพิ่มเติม

ฉันได้สร้างสคริปต์ Powershell สั้น ๆ ที่จะให้ที่อยู่ IP ของคุณเมื่อใดก็ตามที่คุณต้องการ

$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) และเรียกใช้ก่อนที่จะเริ่มแอปของคุณ คุณสามารถบันทึกลงในโฟลเดอร์โครงการของคุณและเรียกใช้เป็น:

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

หมายเหตุ: ฉันบันทึกรหัสเชลล์ด้านบนใน getIP.ps1

Cool.👌


1
ใช่! มันได้ผล. ฉันสามารถรับมันบนมือถือของฉันโดยการตั้งค่า ipv4 ip เป็นขวด หวังว่ามันจะช่วยคนอื่นด้วย :)
Ashu Kumar

@nwillo ทำมือถือและเครื่องที่ฉันให้บริการเชื่อมต่อกับ wifi / เครือข่ายเดียวกัน
sachin rathod

@sachinrathod ใช่ พวกเขาต้อง นั่นเป็นวิธีที่พวกเขาสามารถเข้าถึงเกตเวย์ IP เดียวกันได้
nwillo

22

หากcoolแอปของคุณมีการกำหนดค่าโหลดจากไฟล์ภายนอกเช่นในตัวอย่างต่อไปนี้อย่าลืมอัปเดตไฟล์กำหนดค่าที่สอดคล้องกับ HOST = "0.0.0.0"

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

1
นี่เป็นวิธีที่ดีในการจัดเก็บชื่อโฮสต์และหมายเลขพอร์ตในการกำหนดค่าขวด ฉันกำลังมองหาวิธีแก้ปัญหานี้อย่างแน่นอน
compie

20

เพิ่มบรรทัดด้านล่างลงในโครงการของคุณ

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

ฉันจะได้รับOSError: [WinError 10013] An attempt was made to access a socket in a way forbidden by its access permissions
พี

วิธีการในการแก้ไขปัญหา คุณจำเป็นต้องเรียกใช้แฟ้มหลามวิ่งในฐานะผู้ดูแลและตรวจสอบพอร์ตใด ๆ ที่ทำงานบน netstat -na|findstr 5005Windows
Jeevan Chaitanya

10

ตรวจสอบว่าพอร์ตเฉพาะนั้นเปิดอยู่บนเซิร์ฟเวอร์เพื่อให้บริการลูกค้าหรือไม่?

ใน Ubuntu หรือ Linux distro

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

กำหนดค่าแอปพลิเคชันเพื่อจัดการคำขอระยะไกล

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


python3 app.py & #run application in background

5

ไปที่เส้นทางโครงการของคุณบน CMD (พร้อมรับคำสั่ง) และดำเนินการคำสั่งต่อไปนี้: -

ตั้ง FLASK_APP = ABC.py

SET FLASK_ENV = การพัฒนา

flask run -h [yourIP] -p 8080

คุณจะได้รับ o / p ต่อไปนี้บน CMD: -

  • แอป Flask ที่ให้บริการ "expirement.py" (สันหลังยาวโหลด)
    • สิ่งแวดล้อม: การพัฒนา
    • โหมดแก้ไขข้อบกพร่อง: เปิด
    • เริ่มต้นใหม่ด้วยสถิติ
    • ดีบักเกอร์ทำงาน!
    • รหัสดีบักเกอร์: 199-519-700
    • ทำงานบนhttp: // [yourIP]: 8080 / (กด CTRL + C เพื่อออก)

ตอนนี้คุณสามารถเข้าถึงแอพพลิเคชั่นขวดบนเครื่องอื่นโดยใช้http: // [yourIP]: 8080 / url


4

หากคุณมีปัญหาในการเข้าถึงเซิร์ฟเวอร์ Flask ของคุณปรับใช้โดยใช้PyCharmให้พิจารณาสิ่งต่อไปนี้:

PyCharm ไม่ได้เรียกใช้ไฟล์. py หลักของคุณโดยตรงดังนั้นโค้ดใด ๆ ในif __name__ == '__main__':จะไม่ถูกเรียกใช้และการเปลี่ยนแปลงใด ๆ (เช่นapp.run(host='0.0.0.0', port=5000)) จะไม่มีผล

แต่คุณควรกำหนดค่าเซิร์ฟเวอร์ Flask โดยใช้ Run Configurations โดยเฉพาะการวาง--host 0.0.0.0 --port 5000ในฟิลด์ตัวเลือกเพิ่มเติม

เรียกใช้การกำหนดรูปแบบของ PyCharm เซิร์ฟเวอร์ Flask

เพิ่มเติมเกี่ยวกับการกำหนดค่าเซิร์ฟเวอร์ Flask ใน PyCharm


นี่แก้ปัญหาทั้งหมดของฉันได้จริงและควรเป็นคำตอบที่ถูกต้องสำหรับคำถามนี้!
Alberto Bellini

4

สำหรับฉันฉันทำตามคำตอบข้างต้นและแก้ไขมันเล็กน้อย:

  1. เพียงแค่คว้าที่อยู่ ipv4 ของคุณโดยใช้ ipconfig เมื่อพร้อมรับคำสั่ง
  2. ไปที่ไฟล์ที่มีรหัสขวดอยู่
  3. ในฟังก์ชั่นหลักเขียน app.run (host = 'ที่อยู่ ipv4 ของคุณ')

เช่น:

ป้อนคำอธิบายรูปภาพที่นี่


3

ฉันมีปัญหาเดียวกันฉันใช้ PyCharm เป็นบรรณาธิการและเมื่อฉันสร้างโครงการ PyCharm สร้าง Flask Server สิ่งที่ฉันทำคือสร้างเซิร์ฟเวอร์ด้วย Python ด้วยวิธีต่อไปนี้

กำหนดค่า Python Server PyCharm โดยพื้นฐานแล้วสิ่งที่ฉันทำคือสร้างเซิร์ฟเวอร์ใหม่ แต่ให้ขวดถ้าไม่ใช่ python

ฉันหวังว่ามันจะช่วยคุณ


โปรดอย่าเพิ่งโพสต์ภาพ - อธิบายเฉพาะสิ่งที่คุณทำเพื่อแก้ไขปัญหา
CertainPerformance

เฮ้แน่นอนถ้าฉันแก้ไขโพสต์แล้วเพื่อปรับปรุงคำตอบ
Juanes30

3

คำตอบนี้ไม่เกี่ยวข้องกับขวดเท่านั้น แต่ควรใช้กับทุกคนที่ไม่สามารถเชื่อมต่อบริการจากปัญหาโฮสต์อื่น

  1. ใช้netstat -ano | grep <port>เพื่อดูว่าที่อยู่คือ 0.0.0.0 หรือ :: ถ้าเป็น 127.0.0.1 แสดงว่าเป็นคำร้องขอโลคัลเท่านั้น
  2. ใช้ tcpdump เพื่อดูว่าแพ็คเก็ตใด ๆ ขาดหายไปหรือไม่ ถ้ามันแสดงความไม่สมดุลอย่างเห็นได้ชัดให้ตรวจสอบกฎการกำหนดเส้นทางโดย iptables

วันนี้ฉันเรียกใช้แอพพลิเคชั่นขวดของฉันตามปกติ แต่ฉันสังเกตเห็นว่ามันไม่สามารถเชื่อมต่อจากเซิร์ฟเวอร์อื่นได้ จากนั้นฉันเรียกใช้netstat -ano | grep <port>และที่อยู่ในพื้นที่คือ::หรือ0.0.0.0(ฉันลองทั้งคู่และฉันรู้ว่า 127.0.0.1 อนุญาตการเชื่อมต่อจากโฮสต์ในพื้นที่เท่านั้น) แล้วฉันจะใช้ผลที่ได้คือเหมือนtelnet host port connect to ...นี่มันแปลกมาก tcpdump -i any port <port> -w w.pcapจากนั้นฉันคิดว่าฉันดีกว่าที่จะตรวจสอบด้วย และฉันสังเกตเห็นว่ามันเป็นเช่นนี้:

ผลลัพธ์ tcpdump แสดงว่ามีเพียงแพ็กเก็ต SYN จากโฮสต์ระยะไกล

จากนั้นโดยการตรวจสอบที่iptables --listส่วน OUTPUT ฉันจะเห็นกฎหลายข้อ:

ผลรายการ iptables

กฎเหล่านี้ห้ามการส่งออก tcp แพ็กเก็ตที่สำคัญในการจับมือกัน โดยการลบพวกเขาปัญหาจะหายไป


1

ไปที่เส้นทางโครงการตั้ง FLASK_APP = ABC.py SET FLASK_ENV = การพัฒนา

flask run -h [yourIP] -p 8080 คุณจะติดตาม o / p บน CMD: - * ให้บริการแอพ Flask "expirement.py" (การโหลดขี้เกียจ) * สภาพแวดล้อม: การพัฒนา * โหมดการดีบัก: เปิด * เปิดใช้งานสถานะดีบักเกอร์ใหม่ ! * หมายเลขดีบักเกอร์: 199-519-700 * ทำงานบนhttp: // [yourIP]: 8080 / (กด CTRL + C เพื่อออก)


1

คุณยังสามารถตั้งค่าโฮสต์ (เพื่อแสดงบนเครือข่ายที่อยู่ IP) และพอร์ตผ่านตัวแปรสภาพแวดล้อม

$ 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

ดูวิธีรับตัวเลือกคำสั่งที่มีอยู่ทั้งหมดเพื่อตั้งค่าตัวแปรสภาพแวดล้อม


1

สร้างไฟล์.flaskenvในไดเรกทอรีรากของโครงการ

โดยทั่วไปพารามิเตอร์ในไฟล์นี้คือ:

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

pip install python-dotenvหากคุณมีสภาพแวดล้อมเสมือนเปิดใช้งานและทำ

แพ็คเกจนี้จะใช้.flaskenvไฟล์และการประกาศภายในจะถูกนำเข้าโดยอัตโนมัติในเซสชันเทอร์มินัล

จากนั้นคุณสามารถทำได้ flask run

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.