Python搭建的Web服务器怎么让局域网其他设备访问
让局域网中的手机、平板或其他电脑访问你在本机运行的 Python Web 服务器,核心只需解决两个关键问题:一是将服务监听地址从默认仅限本机的 127.0.0.1 修改为监听所有网卡的 0.0.0.0;二是确保宿主机操作系统防火墙放行相应端口,并通过路由器分配给主机的局域网 IP 发起访问。
很多开发者在刚接触 Python Web 开发时,都会遇到一个常见现象:使用内置的 http.server 或编写好 Flask、FastAPI、Django 程序后,电脑自带的浏览器打开 http://127.0.0.1:8000 或 http://localhost:8000 运行一切正常;但只要拿起身边的手机连接同一个 Wi-Fi,输入电脑的局域网 IP 地址,页面便会一直转圈提示超时,或者直接显示“拒绝连接”。
要搞清楚如何让局域网设备成功通信,必须先明确数据包在局域网内部是如何传递的,以及为什么默认参数会把外部请求拒之门外。
一、为什么默认配置只能本机访问:127.0.0.1 与 0.0.0.0 的区别
计算机内部并不是只有一个抽象的“网络地址”,而是拥有多个物理或虚拟的网络接口。操作系统为每个接口分配不同的 IP 地址:
- 本地回环接口(Loopback Interface,通常对应 127.0.0.1):这是系统内部的一条虚拟网络通道。所有发往该地址的数据包,都会直接在操作系统内核的网络协议栈内部掉头返回,根本不会经过物理网卡(如无线网卡或以太网网线)。因此,外界任何物理线路上的设备都无法向
127.0.0.1投递数据。 - 物理局域网接口(如 192.168.1.100):这是路由器分配给网卡的真实局域网 IP,局域网内的路由器与其他终端正是通过这个 IP 来寻址你的设备。
- 所有网络接口(INADDR_ANY,即 0.0.0.0):在网络编程中,
0.0.0.0并不是一个具体的真实 IP,而是一个特殊的指示标志。当一个服务绑定在0.0.0.0时,意味着它告诉操作系统内核:“无论是通过本地回环送进来的数据包,还是通过无线网卡、有线网卡送进来的数据包,只要访问对应端口,全部接收并交给我处理”。
出于安全性考虑,几乎所有 Web 框架(如 Flask、Django)在默认启动时,都只将服务绑定在 127.0.0.1,以防止开发阶段的代码被局域网内的不可信终端直接刺探。如果不显式修改绑定目标,服务就仅对本机暴露。
二、关键步骤:修改各类 Python Web 服务的监听地址
不同框架或模块指定监听地址的语法略有不同。无论使用什么工具,目标都是明确告诉它把地址设为 0.0.0.0。
1. Python 内置模块 http.server
如果只是想快速共享当前目录的文件,很多人习惯输入 python -m http.server 8000。在较新的 Python 3 版本中,它默认会监听所有接口,但如果遇到只能本机访问,可以通过 --bind 参数显式指定:
python -m http.server 8000 --bind 0.0.0.0
执行后终端会输出提示:
Serving HTTP on 0.0.0.0 port 8000 (http://0.0.0.0:8000/) ...
2. Flask 框架
直接调用 app.run() 时,默认绑定的是 127.0.0.1。在脚本的入口函数中,将 host 参数改为 '0.0.0.0':
from flask import Flask
app = Flask(__name__)
@app.route('/')
def home():
return "Hello from Local Network!"
if __name__ == '__main__':
# 将 host 设置为 0.0.0.0 即可允许局域网设备接入
app.run(host='0.0.0.0', port=5000, debug=True)
如果是通过命令行 flask run 启动,则添加 --host 选项:
flask run --host=0.0.0.0 --port=5000
3. FastAPI 与 Uvicorn
FastAPI 应用通常使用 Uvicorn 作为 ASGI 服务器驱动。在命令行启动时,加入 --host 0.0.0.0 参数:
uvicorn main:app --host 0.0.0.0 --port 8000 --reload
如果是通过 Python 代码直接启动 Uvicorn:
main.pyimport uvicorn
from fastapi import FastAPI
app = FastAPI()
@app.get("/")
def read_root():
return {"status": "success", "network": "LAN ready"}
if __name__ == "__main__":
uvicorn.run("main:app", host="0.0.0.0", port=8000, reload=True)
4. Django 框架
Django 的 runserver 命令在不带额外参数时,默认监听 127.0.0.1:8000。启动时直接在端口前附带 0.0.0.0::
python manage.py runserver 0.0.0.0:8000
Django 注意事项:Django 具备域名与 Host 过滤机制。将监听地址改为 0.0.0.0 之后,还必须打开项目目录下的 settings.py,在 ALLOWED_HOSTS 列表中添加主机的局域网 IP,或者临时设为通配符:ALLOWED_HOSTS = ['*'](仅用于开发测试阶段)。否则访问时会报错 Bad Request (400)。
三、获取宿主机的局域网真实 IP 地址
服务器配置成监听 0.0.0.0 之后,其他局域网设备并不能在浏览器里输入 0.0.0.0:8000,而是需要输入宿主机在路由器中拿到的真实局域网 IP(常见形态如 192.168.1.X、192.168.0.X 或 10.0.0.X)。
各操作系统查询本机局域网 IP 的方法:
- Windows 系统:
按
Win + R键输入cmd打开命令提示符,执行:ipconfig在输出结果中找到正在联网的网卡(如“无线局域网适配器 WLAN”或“以太网适配器”),查看对应的 IPv4 地址,例如
192.168.1.100。 - macOS 系统:
打开“终端”(Terminal),执行:
ipconfig getifaddr en0如果使用的是外接网卡或扩展坞,网卡名称可能是
en1。终端将直接打印出一行纯 IP 地址(例如192.168.1.102)。也可以按住Option键点击屏幕右上角的 Wi-Fi 图标,在展开的详细参数中直接看到“IP 地址”。 - Linux 系统:
在终端执行:
ip addr show # 或者快速查看简要 IP hostname -I
四、配置操作系统防火墙(常见卡点)
很多时候,即使代码里已经写了 0.0.0.0,手机依然无法访问,这是因为操作系统的防火墙默认会将未经允许的外部入站连接拦截掉。
1. Windows 防火墙处理
首次运行 Python 脚本监听全网卡时,Windows 安全中心通常会弹出一个“Windows Defender 防火墙已阻止该应用的部分功能”的对话框。务必勾选“专用网络(例如家庭或工作网络)”并点击“允许访问”。
如果之前误点了取消,可以在“控制面板” -> “系统和安全” -> “Windows Defender 防火墙” -> “高级设置”中处理:
- 点击左侧的“入站规则”,然后在右侧点击“新建规则”。
- 规则类型选择“端口”,点击下一步。
- 选择 TCP,并在“特定本地端口”中填入 Python 服务使用的端口号(如
8000或5000)。 - 操作选择“允许连接”。
- 在配置文件页面保持“域”、“专用”勾选(公用网络根据安全需求决定)。
- 为规则命名(例如
Python Web 8000),点击完成。
2. Linux 系统防火墙
如果服务器运行在 Ubuntu/Debian 上且启用了 ufw:
sudo ufw allow 8000/tcp
sudo ufw reload
如果运行在 CentOS/RHEL/Fedora 上使用 firewalld:
sudo firewall-cmd --zone=public --add-port=8000/tcp --permanent
sudo firewall-cmd --reload
3. macOS 系统防火墙
macOS 默认防火墙通常处于关闭状态或仅限制特定系统服务。若启用了防火墙,在“系统设置” -> “网络” -> “防火墙”中,当 Python 进程尝试监听外部请求时,点击系统弹窗允许接入即可。
五、常见问题排查与避坑指南
按照上述配置后,如果在其他设备上仍无法打开页面,可以对照下表快速排查原因并采取对应措施:
| 故障现象 | 根本原因分析 | 排查与解决方法 |
|---|---|---|
| 连接被拒绝 (Connection Refused) |
服务根本没有运行,或者仍然绑定在 127.0.0.1。 |
检查 Python 运行终端是否意外终止;确认启动代码是否包含了 0.0.0.0 声明。 |
| 连接超时 (Connection Timed Out) |
宿主机防火墙未放行端口,或者网络间存在数据阻断。 | 检查 Windows/Linux 入站规则;在宿主机临时关闭防火墙进行 30 秒快速联通测试。 |
| 完全找不到主机 / 无法访问 | 两台设备并不在同一个真正的局域网子网内。 | 手机连接了“访客 Wi-Fi”;路由器开启了“AP 隔离”;或者抄错了虚拟网卡 IP。 |
| Django 报 Bad Request (400) | Django 的安全机制拦截了未经许可的 Host 头。 | 在 settings.py 中将局域网 IP 加入 ALLOWED_HOSTS。 |
特别提醒:多网卡与虚拟网卡干扰
如果电脑安装了 WSL2、Docker Desktop、VMware 或 VirtualBox,在执行 ipconfig 时可能会看到很多类似 vEthernet (WSL) 或 VMware Network Adapter 的网卡。这些网卡的 IP(如 172.x.x.x 或 192.168.99.x)是宿主机与虚拟机通信专用的内部虚拟网络,局域网里的手机是无法访问这个 IP 的。务必认准连接真实路由器 Wi-Fi 或插网线的物理网卡 IP。
总结
让局域网其他设备访问 Python 搭建的 Web 服务器,本质上就是打通网络通路的过程:
- 程序层:将 Web 服务监听地址显式配置为
0.0.0.0,使其接收来自物理网卡接口的数据包。 - 系统层:在宿主机防火墙中添加入站放行规则,避免外界建立连接的 TCP SYN 包被系统直接丢弃。
- 网络层:确保所有访问设备均接入同一个局域网,避开访客网络与 AP 隔离机制,使用宿主机的真实物理局域网 IP 加端口进行连接。
只要依次核对好这三个环节,任何基于 Python 开发的 Web 站点或接口测试服务都能在局域网内稳定流畅地供其他设备访问调试。
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













