Python:临时起一个静态文件服务,`http.server` 很顺手

47 次浏览7 条回复

有时候只是想把当前目录里的几个文件在浏览器里看一下,或者让同一局域网里的设备临时访问一下,不一定要先装 nginx 之类的东西。Python 自带的 http.server 就够轻量。

环境:Python 3.8+。随便建个目录试:

mkdir py-static-demo && cd py-static-demo
printf '<h1>hello</h1>\n' > index.html
python -m http.server 8000

然后浏览器打开:

http://127.0.0.1:8000

如果想指定别的目录,不用先 cd 过去,也可以:

python -m http.server 8000 --directory ./public

这个适合临时预览、传个小文件、看构建产物。别把它当正式服务暴露到公网就行,权限、日志、访问控制这些都不是它的重点。

补一个小点:如果只是自己本机预览,可以顺手加上 --bind 127.0.0.1,别让局域网里其它机器也能扫到。

python -m http.server 8000 --bind 127.0.0.1

真要给同网段设备临时访问时再去掉,或者绑定到指定网卡 IP,会更清楚一点。

还有个容易忽略的点:目录里没有 index.html 的时候,它会直接给出文件列表。

所以临时共享目录前最好先确认一下当前目录里没有顺手放进去的配置、日志、压缩包之类的东西。只想预览构建产物的话,用 --directory dist 这种方式会更不容易把项目根目录暴露出来。

再补个排查小技巧:端口被占用时可以直接换个端口,比如 80019000,没必要先纠结是谁占着。

python -m http.server 8001 --directory dist

临时预览前端产物时我会这样起,结束了 Ctrl+C 停掉就行。

还有一个小坑:http.server 不会帮单页应用做路由回退。

比如直接打开 /settings 这种前端路由,目录里没有对应文件时就会 404。只是看静态资源没问题;要预览 SPA 的刷新和深链接,还是用项目自己的 dev server 或者带 fallback 的静态服务更稳。

Nathan03Lv1#1

补一个小点:如果只是自己本机预览,可以顺手加上 --bind 127.0.0.1,别让局域网里其它机器也能扫到。

python -m http.server 8000 --bind 127.0.0.1

真要给同网段设备临时访问时再去掉,或者绑定到指定网卡 IP,会更清楚一点。

如果想临时给同一网络里的手机看页面,启动后终端里一般只会显示监听端口,不一定告诉你机器地址。可以另开一个终端查一下本机局域网 IP:

# macOS / Linux 常见可用
ip addr | grep 'inet ' | grep -v 127.0.0.1

然后手机浏览器开 http://你的IP:8000。访问不了时先看是不是防火墙拦了,或者服务只绑定在 127.0.0.1 上。

还可以留意一下软链接。http.server 处理目录时会跟随符号链接,所以目录里如果有链接指到外面的路径,可能会把原本不想共享的文件也暴露出来。

临时开服务前,把目录换成一个干净的 public/dist/ 会省心很多。

如果只是想临时验证下载行为,也可以用 curl -I 看一下它给的响应头:

curl -I http://127.0.0.1:8000/index.html

http.server 会按扩展名猜 Content-Type,大多数常见静态文件够用;但要测 gzip、缓存策略、鉴权这类东西,它就不太适合了,还是得换正式一点的服务。