fastapi参数基础

fastapi中Optional的含义

在 FastAPI 中,Optional 是 Python 的类型提示的一部分,通常用于函数参数和返回值的类型注解。Optional 表示一个可选的值,即一个参数可以是指定的类型,也可以是 None。

具体来说,Optional[T] 表示参数可以是类型 T 的实例,也可以是 None。这在函数参数和返回值中非常有用,因为它允许你指定一个参数是可选的,可以有值也可以没有值。

例如,假设您有一个 FastAPI 路由函数,接受一个可选的整数作为参数,您可以这样注解:

from fastapi import FastAPI
from typing import Optional

app = FastAPI()

@app.get("/items/")
async def read_item(skip: Optional[int] = None):
    if skip is not None:
        return {"skip": skip}
    return {"message": "No skip parameter provided."}

在上面的示例中,skip 参数被注解为 Optional[int],这意味着它可以是一个整数,也可以是 None。如果客户端请求 /items/ 路由时不提供 skip 参数,函数将返回一个包含消息的 JSON 响应。如果客户端提供了 skip 参数,函数将返回包含 skip 值的 JSON 响应。

使用 Optional 类型提示可以使您的代码更加清晰,同时允许函数参数具有默认值 None,以处理缺少参数的情况。这提高了代码的灵活性和可读性。

fastapi中Query的含义

在 FastAPI 中,Query 是一个用于定义查询参数的装饰器(decorator),它允许你指定请求 URL 中的查询参数,以及相关的验证和文档信息。

Query 装饰器通常用于在路由函数的参数中声明查询参数,以便 FastAPI 可以自动从请求中提取查询参数的值并将其传递给路由函数。它有以下几种用法:

基本用法:

from fastapi import FastAPI, Query

app = FastAPI()

@app.get("/items/")
async def read_item(skip: int = Query(None, description="跳过的项目数")):
    return {"skip": skip}

在上面的示例中,skip 是一个查询参数,通过 Query 装饰器注释在路由函数的参数中。它的默认值为 None,这意味着如果客户端没有提供 skip 查询参数,它将为 None。description 参数用于添加文档描述。

指定查询参数的名称:

@app.get("/items/")
async def read_item(skip: int = Query(None, description="跳过的项目数", alias="skip_items")):
    return {"skip": skip}

在这个示例中,使用了 alias 参数来指定查询参数的名称。客户端可以使用 skip_items 参数名来提供查询参数值。

指定查询参数的验证规则:

from pydantic import BaseModel

class Item(BaseModel):
    name: str
    description: str = None
    price: float
    tax: float = None

@app.get("/items/")
async def read_item(item: Item = Query(..., description="要查询的项目")):
    return {"item": item}

在上面的示例中,我们使用了一个 Pydantic 模型类 Item 来定义查询参数的验证规则。如果客户端提供的查询参数不符合模型的规则,FastAPI 将返回一个验证错误。

指定查询参数的默认值和是否必需:

None 表示参数是可选的,如果客户端不提供该参数,将使用默认值为 None。
... 表示参数是必需的,客户端必须提供它。
使用其他默认值,如 skip: int = Query(0),表示如果客户端不提供该参数,将使用默认值 0。
总之,Query 装饰器用于定义查询参数,包括名称、验证规则、默认值等。这些参数不仅用于提取客户端请求中的查询参数,还用于自动生成文档和验证输入数据。这使得 FastAPI 能够快速开发安全且具有文档的 API。

posted @ 2023-09-13 16:57  岳宗柯  阅读(252)  评论(0编辑  收藏  举报