有人能告诉我,在没有实例化UserIn和UserOut类对象的情况下,下面的pydantic模型代码是如何工作的吗?这是由pydantic库内部处理的吗?
from typing import Optional
from fastapi import FastAPI
from pydantic import BaseModel, EmailStr
app = FastAPI()
class UserIn(BaseModel):
username: str
password: str
email: EmailStr
full_name: Optional[str] = None
class UserOut(BaseModel):
username: str
email: EmailStr
full_name: Optional[str] = None
class UserInDB(BaseModel):
username: str
hashed_password: str
email: EmailStr
full_name: Optional[str] = None
def fake_password_hasher(raw_password: str):
return "supersecret" + raw_password
def fake_save_user(user_in: UserIn):
hashed_password = fake_password_hasher(user_in.password)
user_in_db = UserInDB(**user_in.dict(), hashed_password=hashed_password)
print("User saved! ..not really")
return user_in_db
@app.post("/user/", response_model=UserOut)
async def create_user(user_in: UserIn):
user_saved = fake_save_user(user_in)
print(user_saved.__dict__)
return user_saved
您不需要在代码中实例化对象,因为在这两种情况下,FastAPI都会为pydantic模式自动创建对象。
对于像示例中的user_in: UserIn
这样的Pydantic模型的端点方法的参数,它被解释为RequestBody,如本文文档中所述。值得注意的是FastAPI文档中关于输入数据绑定如何为端点参数工作的解释:
- 如果参数也在路径中声明,则它将用作路径参数
- 如果参数是单数类型(如int、float、str、bool等(,则它将被解释为查询参数
- 如果参数被声明为Pydantic模型的类型,它将被解释为请求主体
对于端点输出,当您定义response_model
时,它也会对其进行转换,如文档中所述:
FastAPI将使用此response_mode来:
- 将输出数据转换为其类型声明
- 验证数据
- 在OpenAPI路径操作中为响应添加一个JSON模式
- 将由自动文档系统使用