FastAPI 入门系列 之 请求!
上篇文章我们了解了 FastAPI 以及它的简单使用,那么这篇文章就来一起学习一下 FastAPI 的请求,了解一下 FastAPI 是如何设置各种形式的请求参数的。
Path 参数
Path(路径)参数在路由里用大括号{}
括起来指定,然后在定义方法时接收该参数,另外,还可以指定参数的类型,例如:
@app.get("/user/{user_id}")
async def hello_user(user_id: int):
return {"Hello user": user_id}
上述代码中,使用user_id: int
指定参数的类型为 int,FastAPI 会通过 Pydantic 模块进行自动校验,如果传入的类型不正确,会得到类似于如下的错误信息:
{
"detail": [
{
"loc": [
"path",
"user_id"
],
"msg": "value is not a valid integer",
"type": "type_error.integer"
}
]
}
我们不需要再去手动校验参数,可以更专注于编写业务代码,提高开发效率。
Query 参数
函数声明的参数不属于路径参数时,它们就被自动解释为Query(查询)参数,就是 url? 之后用&
分割的 key-value 键值对。
@app.get("/users")
async def users(page: int, page_size: int = 10, name: str = None):
return {"page": page, "page_size": page_size, "data": []}
同样,我们可以指定参数类型,并且可以设置默认值,如上 page_size 参数的默认值为10,如果不上传该参数,那就取默认值10。当然也可以把默认值设置None
,表示可选的查询参数,比如上面的 name 参数,该参数可传可不传。
另外,Pydantic 模型支持很丰富的数据类型,除了常用的 str、int、float、List、Dict外,还有时间、日期、uuid等类型。
请求体参数
设置请求体参数的话,我们需要定义一个数据模型类,且继承 Pydantic 模块的BaseModel
类,如下:
class User(BaseModel):
name: str
password: str = '123456'
description: str = None
同样,如果指定数据类型和默认值,如果设置了默认值,那么该参数不是必传的。
然后在定义函数时,将参数指定为数据模型类 User 类型即可:
@app.post("/add")
async def add(user: User):
return {"name": user.name, "password": user.password}
FastAPI 会自动将定义的模型类转化为JSON Schema
,Schema 成为 OpenAPI 生成模式的一部分,并显示在 API 交互文档中,查看 API 交互文档如下,该接口将接收application/json
类型的参数。
我们还可以定义更加复杂的请求模型类,例如属性为 List 列表、Dict 字典类型,或者是一个嵌套的模型类。
FastAPI 支持同时定义 Path 参数、Query 参数和请求体参数,FastAPI 将会正确识别并获取数据。
- 如果参数在 url 中也声明了,它将被解释为 path 参数
- 如果参数是单一类型(例如int、float、str、bool等),它将被解释为 query 参数
- 如果参数类型为继承 Pydantic 模块的
BaseModel
类的数据模型类,则它将被解释为请求体参数
Form Data
FastAPI 可以使用Form组件来接收表单数据,需要先使用pip install python-multipart
命令进行安装。
声明 Form Data 表单参数的方式与 Path 参数或 Query 参数相同,如下:
@app.post("/login")
async def login(*, name: str = Form(...), password: str = Form(...)):
return {"Hello user": name}
参数接收必须使用Form
,否则参数将被解释为Query参数或请求体参数。
Request 请求对象
想要直接访问 Request 对象时,需要在函数中声明Request类型的参数,FastAPI 就会自动传递 Request 对象给这个参数,我们就可以获取到 Request 对象及其属性信息,例如 header、url、cookie、session 等。
@app.post("/login")
async def login(request: Request):
return {"Hello": request.url}
另外,如果想要获取请求的 cookie、header 信息,还可以通过在函数内声明 Cookie 类型、Header 类型的参数进行接收,FastAPI 也会帮我们自动处理并接收这些信息,非常方便。
Path、Query、Body、Form、Cookie、Header等类都继承自 Param 类,使用他们我们可以方便的声明获取不同类型的请求参数。
原创不易,如果小伙伴们觉得有帮助,麻烦点个赞再走呗~
最后,感谢女朋友在工作和生活中的包容、理解与支持 !
转载自:https://juejin.cn/post/7035112612111056910