如何使用装饰器返回的字典作为变量?

How to use a dict returned by a decorator as a variable?

我正在使用 flask-restx 开发一个烧瓶应用程序。在那里,我想用一个名为 cognito_check_groups 的装饰器来装饰路由,该装饰器检查令牌、验证它并 returns 声明。

我想知道有什么方法可以将返回的 claims 保存为变量,以便我可以进一步使用它的内容

我的代码:

def cognito_check_groups(groups: list):
    def decorator(function):
        def wrapper(*args, **kwargs):
            _cognito_check_groups(groups)
            return function(*args, **kwargs)
        return wrapper
    return decorator

def _cognito_check_groups(groups: list):

    token = None
    if 'x-access-token' in request.headers:
        token = request.headers['x-access-token']

    if not token:
        return abort(
            401,
            'Missing token'
        )

    headers = jwt.get_unverified_headers(token)
    kid = headers['kid']
    
    key_index = -1
    for i in range(len(keys)):
        if kid == keys[i]['kid']:
            key_index = i
            break
    if key_index == -1:
        print('Public key not found in jwks.json')
        return False

    public_key = jwk.construct(keys[key_index])
    message, encoded_signature = str(token).rsplit('.', 1)
    decoded_signature = base64url_decode(encoded_signature.encode('utf-8'))
    
    if not public_key.verify(message.encode("utf8"), decoded_signature):
        print('Signature verification failed')
        return False
    print('Signature successfully verified')
    
    claims = jwt.get_unverified_claims(token)
    return claims

我使用过的装饰器如下:

@crud_ns.route("/insert")
class InsertVendor(Resource):
    @crud_ns.doc(
        "Insert data into the DB",
        responses={
            200: "Values returned",
            400: "Validation Error",
            401: "Not authorized",
            409: "Conflct"
        },
    )
    @crud_ns.doc(security='apikey')
    @crud_ns.expect(crud_insert_parser, validation=True)
    @cognito_check_groups(['admin'])
    def post(self):
        args = crud_insert_parser.parse_args()
        return Insert.insert(**args)

虽然我对 Flask 了解不多,但通常你可以这样:

def cognito_check_groups(groups: list):
    def decorator(function):
        def wrapper(*args, **kwargs):
            claims = _cognito_check_groups(groups)
            # add claims to kwargs!
            kwargs.update({'claims': claims})
            return function(*args, **kwargs)
        return wrapper
    return decorator

...
@cognito_check_groups(['admin'])
def post(self, *args, **kwargs):
    claims = kwargs.get('claims', {})
    args = crud_insert_parser.parse_args()
    return Insert.insert(**args)