fastapi接受post参数的方式有哪些?

559 阅读2分钟

1. 安装 FastAPI 和 Uvicorn

首先,确保你已经安装了 FastAPI 和 Uvicorn。可以使用以下命令进行安装:

bash
pip install fastapi uvicorn

2. 创建 Pydantic 模型

Pydantic 模型用于定义请求体的结构和数据验证。下面是一个示例模型,表示一个商品(Item):

python
from pydantic import BaseModel, Field

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

    class Config:
        schema_extra = {
            "example": {
                "name": "Sample Item",
                "price": 10.5
            }
        }

在这个模型中,nameprice 是必填字段,而 descriptiontax 是可选字段。我们还添加了一个 Config 类来提供示例数据,这将在 API 文档中显示。

3. 创建 FastAPI 应用并定义 POST 路由

接下来,创建一个 FastAPI 应用,并定义一个处理 POST 请求的路由:

python
from fastapi import FastAPI

app = FastAPI()

@app.post("/items/")
async def create_item(item: Item):
    return item

@app.post("/users/{user_id}/items/")
async def create_item_for_user(user_id: int, item: Item):
    return {"user_id": user_id, "item": item}

在这个例子中,当向 /items/ 发送 POST 请求时,FastAPI 会自动解析请求体中的 JSON 数据,并将其转换为 Item 对象。如果请求体不符合模型的要求,FastAPI 会返回一个错误响应。我们还添加了一个路由来处理用户 ID 作为路径参数。

4. 启动应用

使用 Uvicorn 启动应用:

bash
uvicorn main:app --reload

这里假设你的代码保存在 main.py 文件中。

5. 测试 POST 请求

你可以使用工具如 Postman 或 curl 来测试这个 POST 接口。以下是一个使用 curl 的示例:

bash
curl -X POST "http://127.0.0.1:8000/items/" -H "Content-Type: application/json" -d '{"name": "Sample Item", "price": 10.5}'

如果请求成功,你将收到如下响应:

json
{
    "name": "Sample Item",
    "description": null,
    "price": 10.5,
    "tax": null
}

6. 使用自定义验证器

你可以使用 Pydantic 的 @validator 装饰器来定义自定义验证器。例如,验证商品名称的长度:

python
from pydantic import BaseModel, Field, validator

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

    @validator("name")
    def name_length(cls, value):
        if len(value) < 5:
            raise ValueError("Name must be at least 5 characters long")
        return value

7. 使用枚举类型

你可以使用 Python 的 enum 模块来定义枚举类型,并在 Pydantic 模型中使用它们:

python
from enum import Enum
from pydantic import BaseModel

class ItemType(str, Enum):
    ELECTRONICS = "electronics"
    FASHION = "fashion"

class Item(BaseModel):
    name: str
    type: ItemType
    price: float

在这个例子中,ItemType 是一个枚举类型,它定义了两种商品类型:电子产品和时尚产品。

总结

通过以上步骤,你可以轻松地在 FastAPI 中处理 POST 请求的参数,并利用 Pydantic 模型确保传入数据的有效性。同时,FastAPI 会自动生成 API 文档,使得构建和维护 API 更加高效和可靠。