1. 为什么是 FastAPI?
兄弟们,如果你还在学那些老掉牙的 Django 或者 Flask,那这一讲你得睁大眼睛了。
在现代全栈开发里,FastAPI 已经是很多大厂和初创公司的首选。为什么?
今天,咱们就用 FastAPI 亲手撸一个生产级的 API 服务。
2. 环境搭建:三行命令搞定
首先,你得装两个东西:FastAPI 框架本身,和用来运行它的 Web 服务器 uvicorn。
pip install fastapi uvicorn
3. Hello World:五行代码跑起一个服务
# main.py
from fastapi import FastAPI
app = FastAPI()
@app.get("/")
def read_root():
return {"message": "你好,全栈之路!"}
# 启动命令:uvicorn main:app –reload
老司机解释:那个 –reload 是开发神器。你改完代码保存,服务器会自动重启,不需要你手动去关掉再开。
4. Pydantic:你的“数据质检员”
写 Web 服务最头疼的就是验证用户传过来的数据。万一该传数字的地方传了字符串,程序就崩了。 FastAPI 搭配 Pydantic,一行代码搞定验证:
from pydantic import BaseModel
# 定义一个“商品”的数据结构
class Item(BaseModel):
name: str
price: float
is_offer: bool | None = None
@app.post("/items/")
def create_item(item: Item):
# 如果用户传的 price 不是数字,FastAPI 会自动返回 422 错误,根本不用你写 if
return {"item_name": item.name, "total_price": item.price * 1.2}
5. 路径参数 vs 查询参数
- 路径参数:/items/42(指定 ID)。
- 查询参数:/items/?skip=0&limit=10(翻页、搜索)。
@app.get("/users/{user_id}")
def read_user(user_id: int, q: str | None = None):
# user_id 会自动转成整数,q 是可选的搜索关键词
return {"user_id": user_id, "query": q}
6. 自动化文档:FastAPI 的“杀手锏”
兄弟们,如果你以前写 API,肯定被写 Swagger 文档折磨过。 在 FastAPI 里,你什么都不用做。服务跑起来后,直接访问:
- http://127.0.0.1:8000/docs
你会看到一个超级精美的交互式文档。你可以在上面直接点“Try it out”测试你的接口,再也不用开 Postman 了!
7. 综合实战:构建一个待办事项 (To-Do) API
咱们来个带增删改查(CRUD)功能的实战案例。
from fastapi import FastAPI, HTTPException
from pydantic import BaseModel
app = FastAPI()
# 模拟数据库
todo_db = []
class Todo(BaseModel):
id: int
title: str
completed: bool = False
@app.post("/todos/", status_code=201)
def add_todo(todo: Todo):
todo_db.append(todo)
return {"message": "添加成功", "data": todo}
@app.get("/todos/")
def list_todos():
return todo_db
@app.get("/todos/{todo_id}")
def get_todo(todo_id: int):
for t in todo_db:
if t.id == todo_id:
return t
raise HTTPException(status_code=404, detail="任务找不到了…")
@app.delete("/todos/{todo_id}")
def delete_todo(todo_id: int):
global todo_db
todo_db = [t for t in todo_db if t.id != todo_id]
return {"message": "删除成功"}
8. 💡 避坑小贴士(老司机的叮嘱)
8. 实战演练:巩固你的内功
题目 1:查询参数与校验
需求: 编写一个 API GET /search/,接收参数 keyword(必填,长度至少 2)和 limit(选填,默认 10,最大 50)。 使用 Query 进行参数校验。
点击查看参考答案
from fastapi import FastAPI, Query
app = FastAPI()
@app.get("/search/")
def search(
keyword: str = Query(..., min_length=2, description="搜索关键词"),
limit: int = Query(10, le=50, description="返回结果数量")
):
return {"keyword": keyword, "limit": limit, "results": ["模拟数据1", "模拟数据2"]}
题目 2:依赖注入与 Token 验证
需求: 编写一个依赖函数 verify_token,检查请求头 x-token 是否为 “fake-super-secret-token”。 如果是,允许访问;否则抛出 400 错误。 将此依赖应用到 GET /protected/ 路由上。
点击查看参考答案
from fastapi import FastAPI, Header, HTTPException, Depends
app = FastAPI()
def verify_token(x_token: str = Header(...)):
if x_token != "fake-super-secret-token":
raise HTTPException(status_code=400, detail="Token 无效")
return x_token
@app.get("/protected/")
def protected_route(token: str = Depends(verify_token)):
return {"message": "验证通过", "token": token}
题目 3:文件上传
需求: 编写一个 API POST /upload/,接收一个文件上传。 返回文件的文件名和文件大小。 提示:需要安装 python-multipart。
点击查看参考答案
from fastapi import FastAPI, UploadFile, File
app = FastAPI()
@app.post("/upload/")
async def upload_file(file: UploadFile = File(...)):
# file.filename 是文件名
# await file.read() 读取内容
content = await file.read()
return {
"filename": file.filename,
"content_type": file.content_type,
"size": len(content)
}
9. 系列索引
- 上一篇:第7讲 | 数据库集成:让你的数据在 MySQL 与 Redis 中安家
- 下一篇:第9讲 | 工程化实战:测试、Git 与生产级部署
写在最后: 这一讲学完,你已经能够把你的 Python 逻辑变成全世界都能访问的服务了。 Web 开发的水很深,安全、高并发、缓存、部署都是大课。咱们先把 API 跑起来,以后再慢慢优化。 别只是看,去电脑上运行那个 To-Do API,打开 /docs 玩一下。 觉得有收获的话,点赞、收藏!咱们下一讲聊聊怎么让你的代码达到生产级别——工程化实战!


