为什么选 FastAPI + Jinja2
个人博客的核心诉求是:轻量、可控、好维护。相比重型的 CMS,自己写一个反而更灵活。
技术选型:
- FastAPI:路由清晰、依赖注入方便、自带 OpenAPI 文档
- Jinja2:模板渲染成熟,与 FastAPI 同为 Python 生态,心智负担小
- SQLite:个人站点无高并发写压力,单文件数据库零运维成本
项目结构
app/
├── main.py # 应用入口
├── config.py # 配置(环境变量可覆盖)
├── database.py # SQLite 建表与种子数据
├── security.py # 密码哈希与会话认证
├── routers/
│ ├── public.py # 前台路由
│ └── admin.py # 后台路由
├── templates/ # Jinja2 模板
└── static/ # CSS / JS / 图片
踩坑记录
- 表单解析:FastAPI 处理
multipart/form-data需要安装python-multipart,否则会报 422。 - 会话中间件:
SessionMiddleware依赖itsdangerous,签名 Cookie 内容可读但不可篡改,敏感信息不要放会话里。 - 模板响应:新版 Starlette 的
TemplateResponse(request, name, context)需要显式传入request。
小结
整套系统依赖极少(fastapi / uvicorn / jinja2 / markdown),一次 pip install 即可跑起来。
后续可以继续扩展:全文搜索、评论系统、RSS 订阅。