在 python-fastApi 中间件中引发异常
Posted
技术标签:
【中文标题】在 python-fastApi 中间件中引发异常【英文标题】:Raise exception in python-fastApi middleware 【发布时间】: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)
【问题讨论】:
我没有发现任何提及它是可能的。虽然您可以尝试使用自定义回复 fastapi.tiangolo.com/advanced/response-directly 您找到解决方案了吗?我有同样的问题。 @TrickOrTreat 【参考方案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))
【讨论】:
以上是关于在 python-fastApi 中间件中引发异常的主要内容,如果未能解决你的问题,请参考以下文章