Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/350.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 装饰师不是';不要争论_Python_Python 2.7_Bottle_Python Decorators - Fatal编程技术网

Python 装饰师不是';不要争论

Python 装饰师不是';不要争论,python,python-2.7,bottle,python-decorators,Python,Python 2.7,Bottle,Python Decorators,我正在尝试向我的瓶子应用程序添加一个access\u rightsdecorator,以便在访问路线时检查权限。但是,它无法获取修饰函数的参数,这会在尝试再次调用我的修饰函数时导致错误 下面是使用decorator的代码示例: @route('/users') @access_rights({'POST': ['admin']}) def users(user): pass def access_rights(permissions): def decorator(f):

我正在尝试向我的瓶子应用程序添加一个
access\u rights
decorator,以便在访问路线时检查权限。但是,它无法获取修饰函数的参数,这会在尝试再次调用我的修饰函数时导致错误

下面是使用decorator的代码示例:

@route('/users')
@access_rights({'POST': ['admin']})
def users(user):
    pass
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
user
参数来自我编写的一个瓶子插件,该插件通过请求传递的令牌获取用户。这是我现在的装饰师:

@route('/users')
@access_rights({'POST': ['admin']})
def users(user):
    pass
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
这样,当执行
get/users
时,我得到
TypeError:users()正好接受一个参数(给定0)
,这意味着
args
kwargs
都是空的。但是,当我按如下方式更改装饰器时,它会起作用:

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

    return decorator

我很少使用decorator,但据我所知,上述两种实现都应该使用原始参数调用
users
函数,但由于某种原因,第一种实现没有获得参数。这是为什么?

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

但是围绕
用户
的装饰程序
访问权限
,没有传递
用户
参数;它只是传递它接收到的任何参数(在本例中,没有任何参数,因此错误消息的“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\u权限
实际向下传递一个用户参数。(它如何确定用户自然取决于您——可能是您在评论中提到的“尚未实现”部分)


希望有帮助

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

但是围绕
用户
的装饰程序
访问权限
,没有传递
用户
参数;它只是传递它接收到的任何参数(在本例中,没有任何参数,因此错误消息的“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\u权限
实际向下传递一个用户参数。(它如何确定用户自然取决于您——可能是您在评论中提到的“尚未实现”部分)


希望有帮助

这个代码对我有用。如果您的第二个decorator语法有效,那么这意味着您没有将其与参数一起使用:即您只是在执行
@access\u rights
而不是
@access\u rights(无论什么)
。可能在某个地方检查了函数名?在这种情况下,包装器上方的
@functools.wrapps(f)
应该会有所帮助。您使用的是py2还是py3?我不认为这有什么大区别,但我很好奇。我尝试过使用
functools.wrapps
但不幸的是,它没有帮助。我忘了在我的问题中指定一些东西(在这个评论之后编辑):
user
参数来自一个瓶子插件;这会影响事情吗?使用Python2。这段代码适合我。如果您的第二个decorator语法有效,那么这意味着您没有将其与参数一起使用:即您只是在执行
@access\u rights
而不是
@access\u rights(无论什么)
。可能在某个地方检查了函数名?在这种情况下,包装器上方的
@functools.wrapps(f)
应该会有所帮助。您使用的是py2还是py3?我不认为这有什么大区别,但我很好奇。我尝试过使用
functools.wrapps
但不幸的是,它没有帮助。我忘了在我的问题中指定一些东西(在这个评论之后编辑):
user
参数来自一个瓶子插件;这会影响事情吗?使用Python2。我完全理解
user
参数没有通过,但这不是我的装饰师的工作。如我在问题中所述,
user
参数是由插件生成和传递的,因此它不应该由decorator处理。对我来说没有意义的是,直接返回
f
,而不是使用传递的参数调用
f
wrapper
,不会产生相同的结果。我在这里遗漏了什么?我完全理解
user
参数没有通过,但这不是我的装饰师的工作。如我在问题中所述,
user
参数是由插件生成和传递的,因此它不应该由decorator处理。对我来说没有意义的是,直接返回
f
,而不是使用传递的参数调用
f
wrapper
,不会产生相同的结果。我错过了什么?