为什么选 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 / 图片

踩坑记录

  1. 表单解析:FastAPI 处理 multipart/form-data 需要安装 python-multipart,否则会报 422。
  2. 会话中间件:SessionMiddleware 依赖 itsdangerous,签名 Cookie 内容可读但不可篡改,敏感信息不要放会话里。
  3. 模板响应:新版 Starlette 的 TemplateResponse(request, name, context) 需要显式传入 request。

小结

整套系统依赖极少(fastapi / uvicorn / jinja2 / markdown),一次 pip install 即可跑起来。
后续可以继续扩展:全文搜索、评论系统、RSS 订阅。