大家好,我是Java1234_小锋老师,最近更新《2027版 一天学会 FastAPI Python web开发 视频教程(无废话版)》专辑,感谢大家支持。
本课程主要介绍和讲解FastAPI简介,HelloWorld实现,自动生成交互式API文档,路径参数,查询参数,请求体,参数校验,响应模型,表单数据和模型,中间件,依赖注入,集成SQLAlchemy ORM 操作数据库,集成Pydantic数据校验等
视频教程+课件+源码打包下载:
链接:https://pan.baidu.com/s/1_NzaNr0Wln6kv1rdiQnUTg
提取码:0000
路由与参数(路径参数&查询参数&请求体参数)
简单来说,路由(Routing)就是“根据请求找对应代码”的映射关系。
在 Web 开发中,它可以拆解为三个核心要素的绑定:
请求方法(GET、POST、PUT 等)
URL 路径(如
/users、/items/123)处理函数(执行具体业务逻辑的代码)
路由的本质就是定义一张“查找表”:当客户端用“方法 A”访问“路径 B”时,服务器自动执行“函数 C”。
以下是 FastAPI 中路径参数、查询参数和请求体参数的详细对比表格,帮你从定义、位置、用途到代码写法一目了然:
| 对比维度 | 路径参数 (Path Parameters) | 查询参数 (Query Parameters) | 请求体参数 (Request Body) |
|---|---|---|---|
| 定义(是什么) | URL路径中固定占位的动态变量,用于定位具体资源。 | URL路径? 之后的键值对,用于过滤、排序或分页。 | 放在 HTTP请求体(Body)中的完整数据,通常为 JSON 格式。 |
| 在 URL 中的位置 | 属于路径的一部分,例如:/users/123 | 属于路径末尾的查询字符串,例如:/users?age=18&page=1 | 不在 URL 中,位于请求报文的独立数据区域(浏览器看不到)。 |
| 常用 HTTP 方法 | 所有方法(GET、POST、PUT、DELETE) | 主要是GET请求(也可用于 DELETE) | 主要是POST、PUT、PATCH(GET 强烈不推荐带 Body) |
| 典型使用场景 | 指定特定资源: 获取 ID 为 123 的用户,或修改 ID 为 5 的文章。 | 筛选和辅助: 查询第 2 页、每页 10 条、按价格排序。 | 提交复杂数据: 注册新用户(包含用户名、密码、邮箱等完整对象),或编辑一篇文章的全文。 |
| 数据复杂度 | 简单数据类型(int、str、UUID) | 简单数据类型(int、str、bool、float) | 复杂结构(嵌套对象、数组,通常用 Pydantic 模型定义) |
| 是否必须传递 | 必须(URL 中缺了它,路由无法匹配,直接报 404) | 非必须(可选),除非你显式声明为必填(...) | 取决于业务逻辑,通常业务需要时必填,但框架层面默认可选。 |
| 数据安全性 | 较高(只暴露资源 ID) | 较低(明文显示在浏览器地址栏,易被收藏/记录,不传敏感信息) | 高(数据在 Body 中,适合传输密码、身份证号等隐私内容) |
| 在 FastAPI 中的定义方式 | 写在路径字符串的{}中:@app.get("/users/{user_id}")函数参数同名即可。 | 定义为非路径参数的函数参数:def list(skip: int = 0) | 定义为Pydantic 模型类型:def create(item: Item)(其中Item继承自BaseModel) |
| 能否在函数参数中省略类型注解 | 可以,但强烈建议加上(方便数据自动转换和校验)。 | 可以,但不加注解会被视为str类型。 | 必须使用类型注解(否则 FastAPI 会把它当作查询参数)。 |
路径参数
路径参数:URL 路径中的可变部分,用于定位具体资源**(如/users/123中的123)。
我们看一个实例:
# -------- 1. 路径参数 -------- @app.get("/users/{user_id}") async def get_user(user_id: int): """路径参数:必须提供,用于获取特定用户""" return {"user_id": user_id, "name": f"用户_{user_id}"}然后打开浏览器访问http://127.0.0.1:8000/docs,进行测试:
查询参数
查询参数:URL 问号后面的键值对,用于过滤、排序、分页(如/items?start=10&limit=20)。
我们看一个实例:
# -------- 2. 查询参数 -------- @app.get("/items") async def list_items(skip: int = 0, limit: int = 10): """查询参数:可选,用于分页""" return {"skip": skip, "limit": limit, "items": ["item1", "item2"]}然后打开浏览器访问http://127.0.0.1:8000/docs,进行测试:
请求体参数
请求体参数:HTTP 请求体(Body)中携带的数据,通常是 JSON,用于提交/修改复杂数据(如注册新用户)。
我们看一个实例:
# -------- 3. 请求体参数 -------- class ItemCreate(BaseModel): name: str price: float @app.post("/items/") async def create_item(item: ItemCreate): """请求体参数:POST 时传入 JSON""" return {"message": "Item created", "item": item}然后打开浏览器访问http://127.0.0.1:8000/docs,进行测试: