FastAPI 入门系列 之 请求!

这是我参与11月更文挑战的第26天,活动详情查看:2021最后一次更文挑战

上篇文章我们了解了 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组件来接收表单数据,需要先使用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 类,使用他们我们可以方便的声明获取不同类型的请求参数。

原创不易,如果小伙伴们觉得有帮助,麻烦点个赞再走呗~

最后,感谢女朋友在工作和生活中的包容、理解与支持 !

猜你喜欢

转载自juejin.im/post/7035112612111056910