Flask,flask-jwt-extended - 尝试自定义处理未经授权的错误

Flask, flask-jwt-extended - trying to custom handle Unauthorized error

我正在构建一个 flask webapp,我正在尝试 return 自定义错误消息,以防在缺少 auth header 时出现 401 错误。对于身份验证,我使用 Flask-Jwt-Extended。我想将 expired_token_loader(callback) 覆盖为 return 401 错误,然后使用 @app.errohandler(401) 捕获它并重定向到登录。
到目前为止我已经这样做了:

@jwt.unauthorized_loader
def unauthorized_callback(callback):
    # Missing auth header
    # abort(401)
    return make_response("", 401)

@app.errorhandler(401)
def unauthorized(e):
    return "Custom 401 Error", 401

在官方Flask-JWT-Extended文档中发现用@jwt.unauthorized_loader装饰的函数必须return一个Flask Response。

因此,当我尝试 abort(401) 时,如上所示,而不是 return 来自 unaturhorized_callback() 的任何内容,它显示 werkzeug.exceptions.Unauthorized: 401 Unauthorized: ...

当我 return make_response("", 401) 它显示这个时,这意味着错误处理程序没有处理错误:


编辑: 我正在尝试重定向 @jwt.unauthorized_loader 的触发器所以我想抛出一个 401 错误然后用例如 @app.errorhandler(401 ) 并重定向。
我这样做是因为我还在构建一个 移动应用程序 ,我在其中捕获 401 错误,当我在 @jwt.unauthorized_loader 中重定向时,它总是错误 302,否则重定向将不起作用。所以我做不到make_response(redirect("/login"), 401)所以我的目标是抛出 401 错误,然后在 Web 应用程序和移动应用程序中以不同的方式处理它。谢谢你的帮助。

我认为这不起作用的原因是 @jwt.unauthorized_loader 的回调方法已经在 @app.errorhandler 的上下文中调用,并且错误处理程序中引发的任何异常都不会导致触发其他错误处理程序。

与其尝试通过中止和异常控制流来处理此问题,为什么不使用辅助方法来生成自定义响应并在两个地方都使用它?

def unauthorized_response():
    return make_response("Custom 401 Error", 401)

@jwt.unauthorized_loader
def unauthorized_callback(callback):
    return unauthorized_response()

@app.errorhandler(401)
def unauthorized(e):
    return unauthorized_response()

不完全是我想要的,但最终它满足了我的需要。 Insted 使用自定义 http 响应代码重定向我使用 401 代码 render_template 如下所示:

@jwt.unauthorized_loader
def unauthorized_callback(callback):
    # Missing auth header
    flash("Missing auth header please login")
    return make_response(render_template("login.html"), 401)