Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/356.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 定制烧瓶安全性';s@auth\u令牌\u需要未经授权的响应_Python_Flask_Flask Security - Fatal编程技术网

Python 定制烧瓶安全性';s@auth\u令牌\u需要未经授权的响应

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" }

我第一次尝试flask,并且尝试创建一个带有基于令牌的身份验证的RESTAPI

一切正常,只是我无法自定义
@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。让我再看一次我的代码,我似乎记得修改过它。