【问题标题】:Raise exception in python-fastApi middleware在 python-fastApi 中间件中引发异常
【发布时间】:2020-08-05 02:13:40
【问题描述】:

我正在尝试在 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)

【问题讨论】:

标签: python fastapi uvicorn starlette


【解决方案1】:

您需要返回响应。我会告诉你如何让它发挥作用:

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 作为您的状态码。

【讨论】:

    【解决方案2】:

    请参阅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)})
    

    【讨论】:

      猜你喜欢
      • 2022-11-21
      • 2019-07-15
      • 2021-10-04
      • 2021-10-28
      • 1970-01-01
      • 2016-12-15
      • 1970-01-01
      • 2011-09-10
      • 2016-03-18
      相关资源
      最近更新 更多