快、类型安全、自带文档。如果你还在用 Flask 手写参数校验,是时候认识一下 FastAPI 了。

一、FastAPI 是什么

FastAPI 是一个基于 Python 类型提示(Type Hints)构建的现代 Web 框架,底层使用 Starlette(ASGI 框架)处理网络与路由,使用 Pydantic 处理数据校验与序列化。

它最核心的三个卖点:

二、快速上手

安装

pip install "fastapi[standard]"

第一个应用

创建 main.py:

from fastapi import FastAPI

app = FastAPI()

@app.get("/")
async def read_root():
    return {"message": "Hello, FastAPI!"}

运行

fastapi dev main.py
# 或者使用 uvicorn
uvicorn main:app --reload

打开 http://127.0.0.1:8000/docs ,你会看到一个完整的交互式 API 文档——这一切都是自动生成的,你一行文档都没写。

三、核心特性

1. 路径参数与查询参数

类型提示直接决定了解析与校验行为:

from fastapi import FastAPI

app = FastAPI()

@app.get("/items/{item_id}")
async def read_item(item_id: int, q: str | None = None):
    return {"item_id": item_id, "q": q}

访问 /items/abc 会直接返回 422 错误,并明确指出 item_id 不是整数——不需要写任何校验代码。

2. 请求体与 Pydantic 模型

from pydantic import BaseModel, Field

class Item(BaseModel):
    name: str = Field(..., max_length=100)
    price: float = Field(..., gt=0)
    tags: list[str] = []

@app.post("/items/")
async def create_item(item: Item):
    return {"name": item.name, "total": item.price * 1.13}

请求体自动解析、自动校验、自动序列化,并且这些规则会同步出现在文档里。

3. 依赖注入(Dependency Injection)

FastAPI 的依赖注入系统是它最优雅的设计之一,尤其适合处理数据库连接、鉴权、公共参数:

from fastapi import Depends, FastAPI, Header, HTTPException

app = FastAPI()

def verify_token(x_token: str = Header(...)):
    if x_token != "secret":
        raise HTTPException(status_code=401, detail="Invalid token")

@app.get("/protected", dependencies=[Depends(verify_token)])
async def protected():
    return {"ok": True}

用 yield 还能优雅地管理资源生命周期:

def get_db():
    db = SessionLocal()
    try:
        yield db
    finally:
        db.close()

依赖可以嵌套、可以缓存、可以被覆盖——测试时替换数据库尤其方便。

4. 原生异步支持

import httpx
from fastapi import FastAPI

app = FastAPI()

@app.get("/proxy")
async def proxy():
    async with httpx.AsyncClient() as client:
        resp = await client.get("https://api.example.com/data")
    return resp.json()

同步函数也没问题,FastAPI 会自动把它放到线程池里执行,不会阻塞事件循环。

5. 自动文档

路径 说明
/docs Swagger UI,可直接调试接口
/redoc ReDoc,更适合阅读
/openapi.json OpenAPI 3.1 Schema,可导入 Postman / 生成客户端 SDK

四、与 Flask / Django 的对比

维度 FastAPI Flask Django
异步支持 原生 async/await 有限(需扩展) 部分支持
数据校验 Pydantic 内置 需手动或扩展 Form / DRF Serializer
自动文档 内置 需插件 需 DRF + drf-spectacular
学习曲线 低 很低 中高
适用场景 API / 微服务 小型服务 全栈重型项目

一句话总结:写 API 用 FastAPI,写全栈管理系统用 Django,写玩具用 Flask。

五、生产部署

最简单的组合是 Gunicorn + Uvicorn Worker:

gunicorn main:app \
  -k uvicorn.workers.UvicornWorker \
  -w 4 \
  -b 0.0.0.0:8000

Docker 示例:

FROM python:3.12-slim

WORKDIR /app
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt

COPY . .
CMD ["uvicorn", "main:app", "--host", "0.0.0.0", "--port", "8000"]

部署前别忘了:

六、小结

FastAPI 的核心哲学是 "声明即实现":你用类型提示声明数据长什么样,框架就替你把解析、校验、序列化和文档全做完。它把 Python 3.6+ 的类型系统从"给 IDE 看的注释"变成了"可执行的契约"。

如果你正准备写一个新的 API 服务,FastAPI 大概率是当下最省心的选择。


参考资源

❤️ 转载文章请注明出处,谢谢!❤️