fastapi + uvicorn 是目前最快、最省事的组合,自带异步、自动文档、类型校验和安全的静态文件服务;flask需手动配置cors、静态路由易引发路径遍历漏洞,django则过于笨重,不适合轻量内网工具。

FastAPI + uvicorn 是目前最快、最省事的组合,不用 Django 的整套生态,也不用 Flask 手动配 CORS 和静态文件路由——它自带异步、自动文档、类型校验和生产级静态服务支持。
为什么不用 Flask 或 Django?
Flask 默认不处理跨域、不带文件上传校验、静态文件路由要自己写 send_from_directory,一不小心就暴露 .. 路径遍历漏洞;Django 太重,启动慢、内存高,内网小工具没必要跑一个完整 Web 框架。而 FastAPI 一行命令就能起服务,staticfiles 模块默认禁止目录穿越,UploadFile 自动限制大小、校验 MIME 类型,更关键的是:它不依赖额外 WSGI 容器,uvicorn 单进程就能扛住百人并发上传下载。
FastAPI 静态文件服务必须禁用目录遍历
直接用 StaticFiles(directory="share") 是危险的——如果用户在 URL 里拼 ../../etc/passwd,旧版 StaticFiles(0.105.0 之前)会返回真实路径内容。修复方式只有两个:
调用 Cutout.Pro 视觉处理 API 进行背景移除、人像抠图和照片增强,支持文件上传与图片 URL 输入。
- 升级到
fastapi>=0.115.0(推荐),该版本已强制规范化路径,../一律被截断 - 手动加白名单校验,例如只允许
.pdf、.xlsx、.zip后缀:if not file_path.suffix.lower() in {".pdf", ".xlsx", ".zip"} - 永远不要把
share目录设为根路径,比如./或/tmp,而应是独立子目录如./internal_share
内网部署只需三步:启动、挂载、限访问
企业内网不需要 HTTPS 和登录页,但必须控制谁可访问、谁可上传。实际操作如下:
- 启动时绑定内网地址:
uvicorn main:app --host 192.168.10.50 --port 8000 --workers 2(别用0.0.0.0) - 用系统防火墙封死外网端口:
firewall-cmd --permanent --remove-port=8000/tcp(CentOS)或ufw deny 8000(Ubuntu) - 上传接口加简单 token 校验(非密码,防误点):
if token != "HR-2026-Q3",硬编码即可,内网环境够用 - 共享目录权限设为
750,属组为intranet-share,仅运维和指定部门成员能读
Docker 化后注意宿主机路径挂载方式
用 Docker 运行时,share/ 目录必须从宿主机挂载,否则容器重启文件就丢了。但不能用 -v /data/share:/app/share 这种绝对路径硬编码——不同服务器路径不一致。正确做法是:
- 启动容器前,先在宿主机创建目录并赋权:
mkdir -p /opt/intranet-share && chown 1001:1001 /opt/intranet-share - Docker run 时用命名卷映射:
-v intranet-share-data:/app/share,再通过docker volume create intranet-share-data统一管理 - 或者更稳妥:在
docker-compose.yml里声明volumes:并指定driver: local和source: /opt/intranet-share
真正容易被忽略的是:Windows/macOS 开发机测试时,Docker Desktop 的文件共享机制会导致 os.stat() 时间戳异常,uvicorn 热重载可能失效——上线前务必在 Linux 服务器上验证一次真实挂载行为。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!










