Fastapi валидация заголовка запроса через pydantic

3дpacтвyйтe, а как можно ли как-нибудь валидировать заголовок запроса через pydantic?

from pydantic import BaseModel, constr

class Token(BaseModel):
    token: constr(min_length=32, max_length=32)


def test_auth(token: str = Header(alias='Authorization'), session: Session = Depends(get_db)):
    #  вот тут нужно проверить заголовок на валидность из схемы

    if not session.query(User).filter_by(token=token).one_or_none():
        raise HTTPException(401)
    return token


@router.put('/')
def put(session: Session = Depends(get_db), token: str = Depends(test_auth)):
    pass

Ответы (1 шт):

Автор решения: Влад Виноградов

Для начала можно глянуть в доку, там есть много примеров аутентификации и авторизации с уже готовыми примерами:

Рекомендую рассматривать варианты оттуда для начала и только потом что-то свое писать.


Depends - довольно удобная штука, если через нее не получается, то всегда можно обойтись обычным вариантом.

from pydantic import BaseModel, constr, ValidationError

class Token(BaseModel):
    token: constr(min_length=32, max_length=32)


def test_auth(token: str | None, session: Session):
    #  вот тут нужно проверить заголовок на валидность из схемы
    try:
      t = Token(token=token).token
    except ValidationError as e:
      raise HTTPException(401)

    if not session.query(User).filter_by(token=t).one_or_none():
        raise HTTPException(401)
    return t


@router.put('/')
def put(request: Request, session: Session = Depends(get_db)):
    test_auth(token=request.headers.get('Authorization'))
    ...
    
→ Ссылка