装饰者没有得到论据

时间:2017-06-16 13:17:47

标签: python python-2.7 bottle python-decorators

我正在尝试向我的Bottle应用添加access_rights装饰器,以便在访问路线时检查权限。但是,它没有获取装饰函数的参数,这会在尝试再次调用我的装饰函数时导致错误。

以下是使用装饰器的代码示例:

@route('/users')
@access_rights({'POST': ['admin']})
def users(user):
    pass

user参数来自我编写的Bottle插件,该插件从通过请求传递的令牌中获取用户。这是我现在的装饰师:

def access_rights(permissions):
    def decorator(f):    
        def wrapper(*args, **kwargs):
            # Check permissions rights here (not implemented yet)

            return f(*args, **kwargs)

        return wrapper

    return decorator

有了这个,我在执行TypeError: users() takes exactly 1 argument (0 given)时得到GET /users,这意味着argskwargs都是空的。但是,当我按如下方式更改装饰器时,它可以工作:

def access_rights(permissions):
    def decorator(f):  
        return f

    return decorator

我没有经常使用装饰器,但根据我的理解,上面的两个实现都应该使用原始参数调用users函数,但由于某种原因,第一个没有得到参数。那是为什么?

1 个答案:

答案 0 :(得分:0)

您的路由处理程序函数users需要一个参数。

但你的装扮师access_rights,你缠绕users,并没有通过user param;它只是传递它收到的任何参数(在这种情况下,没有任何参数,因此" 0给出"错误信息的一部分)。

一个例子应该有助于澄清。这是一个小而完整的应用程序,基于您的原始代码:

from bottle import route, Bottle

app = Bottle()

def access_rights(permissions):
    def decorator(f):
        def wrapper(*args, **kwargs):
            # Check permissions rights here (not implemented yet)

            the_user = 'ron'  # hard-coded for this example

            return f(the_user, *args, **kwargs)

        return wrapper

    return decorator


@app.route('/users')
@access_rights({'POST': ['admin']})
def users(user):
    return ['hello, {}'.format(user)]


app.run(host='127.0.0.1', port=8080, debug=True)

请注意,我所做的唯一重大改变是让access_rights实际传递用户参数。 (当然,它如何决定用户对你的影响 - 可能是你在评论中提到的那部分未被实现的部分。

希望有所帮助!