Python 定制烧瓶安全性';s@auth\u令牌\u需要未经授权的响应
我第一次尝试flask,并且尝试创建一个带有基于令牌的身份验证的RESTAPI 一切正常,只是我无法自定义Python 定制烧瓶安全性';s@auth\u令牌\u需要未经授权的响应,python,flask,flask-security,Python,Flask,Flask Security,我第一次尝试flask,并且尝试创建一个带有基于令牌的身份验证的RESTAPI 一切正常,只是我无法自定义@auth\u token\u required返回的未经授权的响应,这是一条默认消息: 未经授权 服务器无法验证您是否有权访问该URL 请求。您提供了错误的凭据(例如,错误的 密码),或者您的浏览器不知道如何提供 需要证书 我希望它返回一个json响应,该响应可能类似于: { "code": 401, "message": "Unauthorized message" }
@auth\u token\u required
返回的未经授权的响应,这是一条默认消息:
未经授权
服务器无法验证您是否有权访问该URL
请求。您提供了错误的凭据(例如,错误的
密码),或者您的浏览器不知道如何提供
需要证书
我希望它返回一个json响应,该响应可能类似于:
{
"code": 401,
"message": "Unauthorized message"
}
到目前为止,我已尝试使用以下方法覆盖未经授权的\u处理程序
:
@app.login_manager.unauthorized_handler
def unauthorized():
// code goes here
但它似乎不适用于
@auth\u-token\u-required
decorator;它似乎起作用了
import json
from flask import Reponse
def unauth_handler():
return Response(json.dumps({'unauthorized': True}), 401)
app.security.unauthorized_handler(unauth_handler)
下面是一个更完整的示例,说明如何调用此函数,以防与下面的错误有关
def setup_app(app):
config(app)
# database init, allows the DB to be available in core but setup per application.
db.init_app(app)
# bcrypt, again available from core.
bcrypt.init_app(app)
# setup assets
app.assets_env = Environment(app)
# login system
app.user_datastore = SQLAlchemyUserDatastore(db, User, Role)
app.security = security.init_app(app, app.user_datastore)
def unauth_handler():
return Response(ejson.dumps({'unauthorized': True}), 401)
app.security.unauthorized_handler(unauth_handler)
logger(app)
jinja_filters(app)
assets(app)
modules(app)
然后我将应用程序传入init中的setup函数。参考pip的响应,Flask Security在内部使用Flask login进行其实现回调。因此,当我们向Flask Security注册回调处理程序时,我们得到的响应超过了调用堆栈 app.security.unauthorized\u处理程序(unauthorized\u处理程序) 因此,请使用Flask登录注册 app.login\u manager.unauthorized\u handler(unauthorized\u handler)
希望这有帮助。更新上述答案
from flask import response, jsonify
from flask_security.decorators import _get_unauthorized_response
user_datastore = SQLAlchemyUserDatastore(db, User, Role)
security = Security()
security_state = security.init_app(app, user_datastore)
def unauth_handler():
if request.is_json:
return jsonify({'status': False, 'message': 'Unauthorized!'}), 401, {'Content-Type': 'application/json'}
else:
return _get_unauthorized_response()
security_state.unauthorized_handler(unauth_handler)
已尝试此代码,但出现错误maximu调用堆栈已超出.Hmmm。让我再看一次我的代码,我似乎记得修改过它。