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组件来接收
伪原创工具 SEO网站优化 https://www.237it.com/
表单数据,需要先使用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 类,使用他们我们可以方便的声明获取不同类型的请求参数。
作者:tigeriaf
链接:https://juejin.cn/post/7035112612111056910