4. 请求体与Pydantic模型
任务说明
本案例将实现一个FastAPI接口,通过Pydantic模型接收JSON请求体,并利用Pydantic的字段类型与约束条件自动完成数据校验。当客户端提交非法数据时,接口自动返回422校验错误;提交合法数据时,接口回显接收到的内容。
核心实现
```python # main.py from fastapi import FastAPI from pydantic import BaseModel, Field, EmailStr app = FastAPI() class UserCreate(BaseModel): username: str = Field(..., min_length=3, max_length=20, description="用户名") age: int = Field(..., ge=0, le=120, description="年龄") email: EmailStr = Field(..., description="邮箱") tags: list[str] = Field(default_factory=list, max_length=5, description="标签") @app.post("/users/") async def create_user(user: UserCreate): return { "message": "用户数据校验通过", "received": user.model_dump() } ```代码说明
上述代码定义了UserCreate模型,其中:
username:字符串类型,长度限制3~20字符;age:整数类型,范围0~120;email:使用EmailStr类型自动校验邮箱格式(需安装email-validator);tags:字符串列表,最多5个元素,默认空列表。
FastAPI将请求体JSON反序列化为UserCreate实例,校验失败时自动返回422错误及详细原因,无需手动编写校验逻辑。
依赖安装与启动
```bash pip install fastapi uvicorn pydantic[email] uvicorn main:app --reload --port 8000 ```接口验证
启动服务后,使用以下命令测试接口行为:
```bash # 合法请求:应返回200及回显数据 curl -X POST "http://127.0.0.1:8000/users/" \ -H "Content-Type: application/json" \ -d '{"username":"alice","age":25,"email":"alice@example.com","tags":["python","fastapi"]}' # 非法请求1:age超出范围,应返回422 curl -X POST "http://127.0.0.1:8000/users/" \ -H "Content-Type: application/json" \ -d '{"username":"bob","age":150,"email":"bob@example.com"}' # 非法请求2:email格式错误,应返回422 curl -X POST "http://127.0.0.1:8000/users/" \ -H "Content-Type: application/json" \ -d '{"username":"carol","age":30,"email":"not-an-email"}' ```判定标准
- 合法请求返回HTTP 200,响应体包含
"message": "用户数据校验通过"及回显数据; - 非法请求返回HTTP 422,响应体包含
"detail"字段,其中明确指出哪个字段违反了哪条约束(如age小于0或大于120、email格式不合法等); - 缺失必填字段(如
username)同样返回422,提示field required。
验证要点
启动服务后,依次执行上述三条curl命令。观察返回状态码与响应体:合法请求返回200且回显数据与提交一致;两条非法请求均返回422,且detail数组中准确指出违规字段与原因。若email校验未生效,请确认已安装pydantic[email]依赖。通过以上验证,即表明Pydantic模型已成功完成请求体的类型与约束自动校验。