如何使用 pydantic 和 fastapi 验证电子邮件的唯一性

问题描述 投票:0回答:1

我正在尝试验证来自请求正文的输入电子邮件,并且我已经在模型中构建了自定义字段验证器。

这是RegisterModel的代码:

from pydantic import BaseModel, EmailStr, Field, field_validator
from repository.repository_user import UserRepository
from pprint import pprint 

class RegisterModel(BaseModel):
   name:str
   email:EmailStr 
   password:str = Field(..., min_length=7)

   @field_validator('email')
   @classmethod
   def email_must_unique(cls, v):
      repo = UserRepository()
      result = repo.find({'email': v})
      pprint(result)
      return result
    

email_must_unique 方法将创建 UserRepository 类的新实例,并将调用 UserRepository 中的 find 方法以根据电子邮件查找特定用户。实际上 email_must_unique 方法尚未完成来验证电子邮件,它只是获取特定用户,但我已经面临错误。

这是 UserRepository 的代码:

from pymongo.database import Database
from fastapi import Depends
from config.db import db_conn

class UserRepository:
    def __init__(self, db: Database = Depends(db_conn)):
        self.repository = db.users   # users is mongo collection

    def find(self, filter: dict):
        result = self.repository.find_one(filter)
        return result

使用这段代码我面临这样的错误:

    self.repository = db.users
                      ^^^^^^^^
AttributeError: 'Depends' object has no attribute 'users'

我不知道是什么原因造成的。 您能给我解决此错误的解决方案或者验证电子邮件唯一性的替代方法吗?

python pymongo fastapi pydantic
1个回答
0
投票

正如 @Chiheb Nexus 的评论中提到的,不要直接调用

Depends
函数。相反,使用更优雅的
Annotated
依赖

例如,

config/db.py
文件应如下所示:

# config/db.py
from typing import Annotated

from fastapi import Depends
from pymongo import MongoClient
from pymongo.database import Database


def get_db() -> Database:
    client = MongoClient("mongodb://localhost:27017/")
    return client.some_database


DbConn = Annotated[Database, Depends(get_db)]  # <-- this is the annotated depend

然后你可以像这样使用它:

from config.db import DbConn


class UserRepository:
    def __init__(self, db: DbConn):  # <- FastAPI will call `DbConn`
        self.repository = db.users

    def find(self, filter: dict):
        result = self.repository.find_one(filter)
        return result

此外,

db
参数中的
__init__
通过
DbConn
进行注释,以便IDE知道其类型。

© www.soinside.com 2019 - 2024. All rights reserved.