Python搭建的Web服务器怎么让局域网其他设备访问

唐可
唐可
发布时间:2026-10-24| 6人浏览过
原创

让局域网中的手机、平板或其他电脑访问你在本机运行的 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 地址,页面便会一直转圈提示超时,或者直接显示“拒绝连接”。

要搞清楚如何让局域网设备成功通信,必须先明确数据包在局域网内部是如何传递的,以及为什么默认参数会把外部请求拒之门外。

Python搭建的Web服务器怎么让局域网其他设备访问
图 1:局域网内部设备与宿主机 Python 服务的网络交互拓扑

一、为什么默认配置只能本机访问: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服务器怎么让局域网其他设备访问
图 2:服务监听地址为 127.0.0.1 与 0.0.0.0 时的网络包分发差异

二、关键步骤:修改各类 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':

app.py
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.py
import 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)。

Python搭建的Web服务器怎么让局域网其他设备访问
图 3:局域网访问标准配置四步流程

各操作系统查询本机局域网 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 防火墙” -> “高级设置”中处理:

  1. 点击左侧的“入站规则”,然后在右侧点击“新建规则”。
  2. 规则类型选择“端口”,点击下一步。
  3. 选择 TCP,并在“特定本地端口”中填入 Python 服务使用的端口号(如 8000 或 5000)。
  4. 操作选择“允许连接”。
  5. 在配置文件页面保持“域”、“专用”勾选(公用网络根据安全需求决定)。
  6. 为规则命名(例如 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。
Python搭建的Web服务器怎么让局域网其他设备访问
图 4:局域网访问故障快速排查与诊断路径总结

特别提醒:多网卡与虚拟网卡干扰

如果电脑安装了 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 服务器,本质上就是打通网络通路的过程:

  1. 程序层:将 Web 服务监听地址显式配置为 0.0.0.0,使其接收来自物理网卡接口的数据包。
  2. 系统层:在宿主机防火墙中添加入站放行规则,避免外界建立连接的 TCP SYN 包被系统直接丢弃。
  3. 网络层:确保所有访问设备均接入同一个局域网,避开访客网络与 AP 隔离机制,使用宿主机的真实物理局域网 IP 加端口进行连接。

只要依次核对好这三个环节,任何基于 Python 开发的 Web 站点或接口测试服务都能在局域网内稳定流畅地供其他设备访问调试。

相关标签:

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。