FastAPI python web开发- 路由与参数(路径参数查询参数请求体参数)

📅 2026/7/11 0:04:56 👁️ 阅读次数 📝 编程学习
FastAPI python web开发- 路由与参数(路径参数查询参数请求体参数)

大家好,我是Java1234_小锋老师,最近更新《2027版 一天学会 FastAPI Python web开发 视频教程(无废话版)》专辑,感谢大家支持。

本课程主要介绍和讲解FastAPI简介,HelloWorld实现,自动生成交互式API文档,路径参数,查询参数,请求体,参数校验,响应模型,表单数据和模型,中间件,依赖注入,集成SQLAlchemy ORM 操作数据库,集成Pydantic数据校验等

视频教程+课件+源码打包下载:

链接:https://pan.baidu.com/s/1_NzaNr0Wln6kv1rdiQnUTg
提取码:0000

路由与参数(路径参数&查询参数&请求体参数)

简单来说,路由(Routing)就是“根据请求找对应代码”的映射关系

在 Web 开发中,它可以拆解为三个核心要素的绑定:

  1. 请求方法(GET、POST、PUT 等)

  2. URL 路径(如/users/items/123

  3. 处理函数(执行具体业务逻辑的代码)

路由的本质就是定义一张“查找表”:当客户端用“方法 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 条、按价格排序。提交复杂数据: 注册新用户(包含用户名、密码、邮箱等完整对象),或编辑一篇文章的全文。
数据复杂度简单数据类型(intstrUUID简单数据类型(intstrboolfloat复杂结构(嵌套对象、数组,通常用 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,进行测试: