我应该如何处理@jwt_required 装饰器中引发的异常? (在烧瓶-jwt-扩展中)
Posted
技术标签:
【中文标题】我应该如何处理@jwt_required 装饰器中引发的异常? (在烧瓶-jwt-扩展中)【英文标题】:How should I handle exceptions raised in @jwt_required decorator? (in flask-jwt-extended) 【发布时间】:2019-07-06 00:18:03 【问题描述】:我有一个带有 @jwt_required 装饰器的函数。
class Test(Resource):
@jwt_required
def get(self):
return "test": "ok"
设置正确的 HTTP 标头时效果很好,即
Authentication: Bearer [TOKEN]
但是当令牌无效/错误或被弄乱时,会引发 jwt.exceptions.DecodeError:
File "env/lib/python3.6/site-packages/flask_restplus/resource.py", line 44, in dispatch_request
resp = meth(*args, **kwargs)
File "env/lib/python3.6/site-packages/flask_jwt_extended/view_decorators.py", line 103, in wrapper
verify_jwt_in_request()
File "env/lib/python3.6/site-packages/flask_jwt_extended/view_decorators.py", line 32, in verify_jwt_in_request
jwt_data = _decode_jwt_from_request(request_type='access')
File "env/lib/python3.6/site-packages/flask_jwt_extended/view_decorators.py", line 267, in _decode_jwt_from_request
decoded_token = decode_token(encoded_token, csrf_token)
File "env/lib/python3.6/site-packages/flask_jwt_extended/utils.py", line 80, in decode_token
encoded_token, verify=False, algorithms=config.algorithm
File "env/lib/python3.6/site-packages/jwt/api_jwt.py", line 84, in decode
payload, _, _, _ = self._load(jwt)
File "env/lib/python3.6/site-packages/jwt/api_jws.py", line 183, in _load
raise DecodeError('Not enough segments')
jwt.exceptions.DecodeError: Not enough segments
我不能总是依赖客户始终使用正确的令牌。 而且我无法捕捉到异常,因为它是在装饰器中引发的,而不是我自己的函数。所以结果是 http 500 错误。我应该如何更优雅地处理异常?
【问题讨论】:
【参考方案1】:Flask-jwt-extended 应该会优雅地为您处理这些问题。如果没有,您可能正在使用另一个破坏本机烧瓶功能的扩展(例如 flask-restful)。您可以尝试设置此选项来修复它app.config[‘PROPAGATE_EXCEPTIONS’] = True
,或者如果您使用导致问题的其他烧瓶扩展程序https://github.com/vimalloc/flask-jwt-extended/issues/86,请查看此线程以获得一些建议
【讨论】:
感谢 vimalloc,我确实在使用 flask-restplus。添加jwt._set_error_handler_callbacks(api)
似乎对我有用!
@user1005265 我的运气不好,你在哪里添加 jwt._set_error ?以上是关于我应该如何处理@jwt_required 装饰器中引发的异常? (在烧瓶-jwt-扩展中)的主要内容,如果未能解决你的问题,请参考以下文章
如何处理 QDialogButtonBox RestoreDefaults 按钮
我应该如何处理“'someFunction' 不是从 'namespace:somePackage' 导出的对象”错误? [关闭]