阅读 165

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类型的参数。

image.png

我们还可以定义更加复杂的请求模型类,例如属性为 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


文章分类
代码人生
文章标签
版权声明:本站是系统测试站点,无实际运营。本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 XXXXXXo@163.com 举报,一经查实,本站将立刻删除。
相关推荐