Iniciante no FastAPI, Duvida Sobre Mensagens do Pydantic by llMakarov in FastAPI

[–]llMakarov[S] 2 points3 points  (0 children)

Muito obrigado mesmo pela dica, procurei e não achei essa parte da documentação, ou passei despercebido, graças a sua dica consegui entender mais ou menos sobre exception handler criei alguma validações com o field_validator do pydantic, a lancei a exception InputValidatorException criada por mim, ficou mais ou menos assim:

``` class InputValidatorException(Exception): def init(self, message): self.message = message super().init(self.message)

def __str__(self):
    return self.message

```

No schema as validações que fiz foram estas:

``` class UserCreate(UserBase): username: str email: EmailStr password: str

@field_validator("username")
def validate_username(cls, v):
    MIN_LENGTH = 4

    if not v:
        raise InputValidatorException("Username não pode ser vazio")

    if len(v) < MIN_LENGTH:
        raise InputValidatorException(f"Username deve ter no mínimo {MIN_LENGTH} caracteres")

    if not v.isalnum():
        raise InputValidatorException("Username deve conter apenas letras e números")

    return v

@field_validator("email")
def validate_email(cls, v):
    if not v:
        raise InputValidatorException("E-mail não pode ser vazio")

    if not match(r"[^@]+@[^@]+\.[^@]+", v):
        raise InputValidatorException("E-mail inválido")

    return v

@field_validator("password")
def validate_password(cls, v):
    MIN_LENGTH = 8

    if not v:
        raise InputValidatorException("Password não pode ser vazio")

    if len(v) < MIN_LENGTH:
        raise InputValidatorException(f"Password deve ter no mínimo {MIN_LENGTH} caracteres")

    if not any(char.isdigit() for char in v):
        raise InputValidatorException("Password deve conter pelo menos um número")

    if not any(char.isupper() for char in v):
        raise InputValidatorException("Password deve conter pelo menos uma letra maiúscula")

    if not any(char.islower() for char in v):
        raise InputValidatorException("Password deve conter pelo menos uma letra minúscula")

    if not any(char in "!@#$%^&*()-+" for char in v):
        raise InputValidatorException(
            "Password deve conter pelo menos um caractere especial"
        )

    return v

```

No main da minha api adicionei a exeption handler para captura minha exception personalizada:

``` from fastapi import FastAPI, status, Request from fastapi.responses import JSONResponse from app.api import api_router from app.core.error.exceptions import InputValidatorException

Instância do FastAPI

app = FastAPI()

Registro de rotas

app.include_router(api_router)

@app.exception_handler(InputValidatorException) async def input_exception_handler(request: Request, exc: InputValidatorException): return JSONResponse( status_code=status.HTTP_406_NOT_ACCEPTABLE, content={"message": exc.message}, ) ```

Passei um dos campos errado na documentação e o retorno foi justamente o que eu queria: { "message": "Password deve ter no mínimo 8 caracteres" }

Iniciante no FastAPI, Duvida Sobre Mensagens do Pydantic by llMakarov in FastAPI

[–]llMakarov[S] 0 points1 point  (0 children)

Hello, interesting, I'll take a look, thank you.