首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Flask-jwt和Flask-resftul错误处理

Flask-jwt和Flask-resftul错误处理
EN

Stack Overflow用户
提问于 2015-10-12 21:59:21
回答 1查看 2K关注 0票数 3

我使用的是flask-jwtflask-restful

这就是flask-jwt处理错误的方式(取自其github代码库),但它们都不允许我使用JWTError的参数。

代码语言:javascript
复制
if auth is None:
        raise JWTError('Authorization Required', 'Authorization header was missing', 401, {
            'WWW-Authenticate': 'JWT realm="%s"' % realm
        })

parts = auth.split()

if parts[0].lower() != auth_header_prefix.lower():
    raise JWTError('Invalid JWT header', 'Unsupported authorization type')
elif len(parts) == 1:
    raise JWTError('Invalid JWT header', 'Token missing')
elif len(parts) > 2:
    raise JWTError('Invalid JWT header', 'Token contains spaces')

try:
    handler = _jwt.decode_callback
    payload = handler(parts[1])
except SignatureExpired:
        raise JWTError('Expired JWT', 'Token is expired', 401, {
            "WWW-Authenticate": 'JWT realm="{0}"'.format(realm)
        })
except BadSignature:
        raise JWTError('Invalid JWT', 'Token is undecipherable')

_request_ctx_stack.top.current_user = user = _jwt.user_callback(payload)

if user is None:
    raise JWTError('Invalid JWT', 'User does not exist')

下面是我尝试处理JWTError的不同方式

在烧瓶中:

代码语言:javascript
复制
def handle_user_exception_again(e):
    if isinstance(e, JWTError):
        data = {'status_code': 1132, 'message': "JWTError already exists."}
        return jsonify(data), e.status_code, e.headers
    return e

app.handle_user_exception = handle_user_exception_again

在烧瓶中-restful (handle_error)

代码语言:javascript
复制
class FlaskRestfulJwtAPI(Api):

def handle_error(self, e):
    if isinstance(e, JWTError):
        code = 400
        data = {'status_code': code, 'message': "JWTError already exists."}
    elif isinstance(e, KeyError):
        code = 400
        data = {'status_code': code, 'message': "KeyError already exists."}
    else:
        # Did not match a custom exception, continue normally
        return super(FlaskRestfulJwtAPI, self).handle_error(e)
    return self.make_response(data, code)

在烧瓶中-restful (error_router)

代码语言:javascript
复制
class FlaskRestfulJwtAPI(Api):

def error_router(self, original_handler, e):
    print(type(e))
    if e is JWTError:#KeyError:
        data =  {
                "code":400,
                "message":"JWTError"
            }
        return jsonify(data), 400
    elif isinstance(e,KeyError):
        data =  {
            "code":400,
            "message":"KeyError"
        }
        return jsonify(data), 400
    else:
        return super(FlaskRestfulJwtAPI, self).error_router(original_handler, e)
EN

回答 1

Stack Overflow用户

发布于 2015-11-13 06:34:28

我看到您正在尝试从这些错误中提取一个HTTPException,这有助于将它们返回给用户。要引发HTTP异常,您可以捕获所有错误,如果它们是JWTError的实例,则可以使用如下函数将它们转换为HTTPException的实例:

代码语言:javascript
复制
def convert_to_http_exception(e):
    if isinstance(e, JWTError):
        jwtdescription = e.error + ": " + e.description
        http_exception = HTTPException(description=jwtdescription)
        http_exception.code = e.status_code
        return http_exception
    else:
        return e
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33083105

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档