Вызов исключения в промежуточном программном обеспечении python-fastApi

Я пытаюсь проверить токен в промежуточном программном обеспечении fastapi, но это кажется невозможным. Как я думаю, промежуточному программному обеспечению необходимо сделать следующий вызов, хотя это и не требуется. Я не могу найти хорошего решения для обработки токена за один раз в этом бэкэнде python-fastapi. Любая помощь приветствуется.

@app.middleware("http")
async def add_middleware_here(request: Request, call_next):
    token = request.headers["Authorization"]
    try:
        verification_of_token = verify_token(token)
        if verification_of_token:
            response = await call_next(request)
            return response
    except InvalidSignatureError as er:
        raise HTTPException(status_code=401)

person TrickOrTreat    schedule 22.04.2020    source источник
comment
Я не нахожу упоминания о том, что это возможно. Хотя вы можете попробовать ответить с помощью настраиваемого ответа fastapi.tiangolo.com/advanced/response-directly < / а>   -  person lsabi    schedule 23.04.2020
comment
Вы нашли решение? У меня такая же проблема. @Кошелек или жизнь   -  person Saeed Esmaili    schedule 29.05.2020


Ответы (2)


Вам нужно вернуть ответ. Я покажу вам, как заставить его работать:

from fastapi.responses import JSONResponse

@app.middleware("http")
async def add_middleware_here(request: Request, call_next):
    token = request.headers["Authorization"]
    try:
        verification_of_token = verify_token(token)
        if verification_of_token:
            response = await call_next(request)
            return response
        else:
            return JSONResponse(status_code=403) # or 401
    except InvalidSignatureError as er:
        return JSONResponse(status_code=401)

Имейте в виду, что использование этого промежуточного программного обеспечения подразумевает, что у вас нет маршрута входа в ваш API (для генерации токенов).

Кроме того, вам следует рассмотреть возможность использования этой зависимости: https://fastapi.tiangolo.com/tutorial/security/simple-oauth2/

Другое дело, что вы можете использовать fastapi.status в качестве кода статуса.

person Marcelo Trylesinski    schedule 09.06.2020

См. Документацию по JSONResponse API.

from fastapi.responses import JSONResponse

@app.middleware("http")
async def errors_handling(request: Request, call_next):
    try:
        return await call_next(request)
    except Exception as exc:
        return JSONResponse(status_code=500, content={'reason': str(exc)})
person Constantin De La Roche    schedule 15.06.2021