如何在 FastAPI 中验证请求体?
How to validate request body in FastAPI?
我知道如果传入的请求正文缺少某些必需的键,FastAPI 会自动引发 422 unserviceable entity
错误。但是,有没有办法在代码中自己检查传入的请求正文,并在缺少所需名称时引发 400 bad request
?
例如,假设我有这个模型和模式:
class Student(Base):
__tablename__ = "student"
id = Column(Integer, primary_key=True)
name = Column(String(50), unique=True, nullable=False)
email = Column(String(100), unique=True, nullable=False)
gpa = Column(Float, unique=False, nullable=False)
class StudentBase(BaseModel):
name: str
email: str
gpa: float
创建新行的 POST 端点是:
@app.post("/student", dependencies=[Depends(check_request_header)],
response_model=schemas.Student, status_code=200)
def create_student(student: schemas.StudentCreate, db: Session = Depends(get_db)):
db_student = crud.get_student(db, student=student)
if db_student:
raise HTTPException(status_code=400, detail="This student has already been created.")
return crud.create_student(db=db, student=student)
预期的请求正文应该是这样的:
{
"name": "johndoe",
"email": "johndoe@gmail.com",
"gpa": 5.0
}
有没有办法检查上述端点的请求正文?
这通常是通过在 ORM 级别对数据库执行任何操作之前使用 pydantic 验证模式来处理的。我强烈建议您使用 FASTApi 项目生成器并查看它是如何在那里组合在一起的:这是(目前)查看 fastapi-> pydantic -> [orm] -> db 模型的最简单方法,正如 FASTApi 的作者所设想的那样。
如果你不使用 ORM,没有什么能阻止你构建一个 'ORM lite',其中 post 数据被解析为一个 pydantic 对象(使用 .from_dict
),然后你手动运行正确的查询。此错误将传播到端点函数,您可以在其中捕获它并根据需要 return 您的错误。
请注意,您也可以自己选择任何方式进行验证。
一般来说,如果您需要发出失败信号,您 raise an HTTPException。
我知道如果传入的请求正文缺少某些必需的键,FastAPI 会自动引发 422 unserviceable entity
错误。但是,有没有办法在代码中自己检查传入的请求正文,并在缺少所需名称时引发 400 bad request
?
例如,假设我有这个模型和模式:
class Student(Base):
__tablename__ = "student"
id = Column(Integer, primary_key=True)
name = Column(String(50), unique=True, nullable=False)
email = Column(String(100), unique=True, nullable=False)
gpa = Column(Float, unique=False, nullable=False)
class StudentBase(BaseModel):
name: str
email: str
gpa: float
创建新行的 POST 端点是:
@app.post("/student", dependencies=[Depends(check_request_header)],
response_model=schemas.Student, status_code=200)
def create_student(student: schemas.StudentCreate, db: Session = Depends(get_db)):
db_student = crud.get_student(db, student=student)
if db_student:
raise HTTPException(status_code=400, detail="This student has already been created.")
return crud.create_student(db=db, student=student)
预期的请求正文应该是这样的:
{
"name": "johndoe",
"email": "johndoe@gmail.com",
"gpa": 5.0
}
有没有办法检查上述端点的请求正文?
这通常是通过在 ORM 级别对数据库执行任何操作之前使用 pydantic 验证模式来处理的。我强烈建议您使用 FASTApi 项目生成器并查看它是如何在那里组合在一起的:这是(目前)查看 fastapi-> pydantic -> [orm] -> db 模型的最简单方法,正如 FASTApi 的作者所设想的那样。
如果你不使用 ORM,没有什么能阻止你构建一个 'ORM lite',其中 post 数据被解析为一个 pydantic 对象(使用 .from_dict
),然后你手动运行正确的查询。此错误将传播到端点函数,您可以在其中捕获它并根据需要 return 您的错误。
请注意,您也可以自己选择任何方式进行验证。
一般来说,如果您需要发出失败信号,您 raise an HTTPException。