【问题标题】:How to access the `database` inside a Fastapi Scheme?如何访问 Fastapi Scheme 中的“数据库”?
【发布时间】:2023-02-10 02:10:39
【问题描述】:

假设我有一条允许客户创建新用户的路线

(伪代码)

@app.route("POST")
def create_user(user: UserScheme, db: Session = Depends(get_db)) -> User:
    ...

我的UserScheme 接受诸如email 之类的字段。我希望能够在不同的模型Settings 中全局设置一些设置(例如max_length)。我如何在方案中访问它?我想在我的方案中访问db

所以基本上我的方案应该是这样的(给定的代码不起作用):

class UserScheme(BaseModel):
    email: str

    @validator("email")
    def validate_email(cls, value: str) -> str:
        settings = get_settings(db)  # `db` should be set somehow
        
        if len(value) > settings.email_max_length:
            raise ValueError("Your mail might not be that long")

        return value

我找不到以某种方式将 db 传递给该方案的方法。我正在考虑在我的路线中验证这些字段(取决于db)。虽然这种方法以某种方式起作用,但错误消息本身不会在特定字段上出现,而是在整个表单上出现,但它应该报告正确字段的错误,以便前端可以正确显示它。

【问题讨论】:

  • 这个问题一般适用于 FastAPI + Pydantic 用法,而不仅仅是在“方案”的情况下。我认为更好的标题可能是如何从 Pydantic 验证器访问 FastAPI Depends 值?

标签: python fastapi pydantic starlette


【解决方案1】:

将数据库会话传递给方案的一种方法是将其作为参数传递给 validate_email 函数,以及正在验证的值:

class UserScheme(BaseModel):
    email: str

@validator("email")
def validate_email(cls, value: str, db: Session) -> str:
    settings = get_settings(db)

    if len(value) > settings.email_max_length:
        raise ValueError("Your email might not be that long")

    return value

@app.route("POST")
def create_user(user: UserScheme, db: Session = Depends(get_db)) -> User:
    user_schema = UserScheme(**user.dict())
    user_schema.validate_email(db=db)
    ...

在这种情况下,当验证用户模式时,数据库会话作为参数传递给 validate_email 方法。您还可以以相同的方式添加其他验证器,它们也可以访问数据库会话。

【讨论】:

  • def validate_email 应该在 class 块内吗?另外——这真的有效吗?当 Pydantic 尝试在 UserScheme 初始化时调用验证器时会发生什么?
猜你喜欢
  • 2014-06-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-06-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多