Decorator没有得到参数

2024-05-18 13:57:49 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试将access_rights装饰器添加到我的瓶子应用程序中,以检查访问路由时的权限。但是,它没有得到修饰函数的参数,这会导致在再次调用修饰函数时出错。在

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

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

user参数来自我编写的一个瓶子插件,它从请求传递的令牌中获取用户。这是我现在的装修师:

^{pr2}$

这两个都是空的。但是,当我按如下方式更改装饰器时,它会起作用:

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

    return decorator

我很少使用decorator,但是根据我的理解,上面的两个实现都应该用它的原始参数调用users函数,但是由于某些原因,第一个实现没有得到参数。为什么?在


Tags: 函数代码应用程序权限瓶子路由参数return
1条回答
网友
1楼 · 发布于 2024-05-18 13:57:49

路由处理程序users需要一个参数。在

但是您的装饰器access_rights,它包围了users,它并没有传递user参数;它只是传递它接收到的任何参数(在本例中,没有任何参数,因此错误消息的“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实际上向下传递一个user param。(它如何决定用户,自然,取决于你大概是“尚未实现”的部分,你在评论中指出)。在

希望有帮助!在

相关问题 更多 >

    热门问题