树莓派3 B+上Flask服务无法外部访问问题求助
树莓派Flask服务无法被其他设备访问的解决方法
问题概述
树莓派3 B+(搭载最新版Raspbian OS)上运行极简Flask HelloWorld脚本,本地启动正常并显示访问IP,但同网络/不同网络的其他设备均无法访问。已尝试更换浏览器、将谷歌浏览器加入防火墙豁免列表、更换访问设备、切换网络、重启树莓派、更换端口等操作,问题仍存在。
测试脚本:
from flask import Flask app = Flask(__name__) @app.route('/') def hello_world(): return 'Hello World!' if __name__ == '__main__': app.run(debug=True)
启动日志:
* Debug mode: on WARNING: This is a development server. Do not use it in a production deployment. Use a production WSGI server instead. * Running on http://xxx.xxx.xxx.xxx:5000 Press CTRL+C to quit * Restarting with stat * Debugger is active! * Debugger PIN: xxx-xxx-xxx-xxx
解决步骤
1. 修改Flask绑定地址,允许外部访问
Flask默认仅绑定127.0.0.1(本地回环地址),只有树莓派自身能访问。修改脚本中app.run的参数,添加host='0.0.0.0',让服务监听所有网卡:
if __name__ == '__main__': app.run(debug=True, host='0.0.0.0')
重启脚本后,日志会显示Running on http://0.0.0.0:5000,此时其他设备可通过树莓派的实际IP访问。
2. 检查树莓派防火墙设置
Raspbian默认可能开启ufw防火墙,需确认目标端口是否放行:
- 查看防火墙状态:
sudo ufw status - 若5000端口未放行,添加规则:
sudo ufw allow 5000/tcp - 若无需防火墙,可直接关闭:
sudo ufw disable
3. 验证网络连通性
- 在访问设备上ping树莓派IP,确认网络可达:
ping xxx.xxx.xxx.xxx - 用telnet测试端口是否开放:
telnet xxx.xxx.xxx.xxx 5000,能连接则端口正常,否则检查端口占用或防火墙配置。
4. 确认端口未被占用
检查目标端口是否被其他程序占用:sudo lsof -i :5000,若有占用,可杀死对应进程,或更换Flask端口(比如改成8080:app.run(debug=True, host='0.0.0.0', port=8080))。
5. 确保同网络设备在同一网段
访问设备和树莓派需连接同一局域网,IP地址段需一致(比如均为192.168.1.x)。不同网络访问需在路由器设置端口转发,将外部端口映射到树莓派的目标端口,同时注意公网IP和安全风险。
内容的提问来源于stack exchange,提问作者John Cunnington
相关产品推荐
相关产品推荐

