Python - 在装饰器中获取原始函数参数

Posted

技术标签:

【中文标题】Python - 在装饰器中获取原始函数参数【英文标题】:Python - Get original function arguments in decorator 【发布时间】:2010-11-03 20:23:36 【问题描述】:

我正在尝试为 WSGI+Werkzeug 应用程序中的视图编写“login_required”装饰器。

为了做到这一点,我需要进入用户的会话,它可以通过传递给视图方法的 Request 对象访问。

不过,我不知道如何在装饰器中获取 Request 实例。我查看了 PEP318,特别是第四个示例,但我不太明白。

这是我正在尝试的:

def login_required(*args, **kw):
    def goto_login(**kw):
        return redirect(url_for('login'))

    def decorate(f):
        # args[0] should be request
        args[0].client_session['test'] = True
        logged_in = 0
        if logged_in:
            return f
        else:
            return goto_login
    return decorate


@login_required()
@expose('/hello/<string:name>')
def hello(request, name):
    return render_template('say_hello.html', name=name)

但我在尝试调用 args[0] 时遇到索引越界错误。

有什么方法可以访问传递给“login_required”装饰器中“hello”函数的请求参数?

【问题讨论】:

【参考方案1】:

装饰器login_required 被传递给函数(在本例中为hello)。

所以你想做的是:

def login_required(f):
    # This function is what we "replace" hello with
    def wrapper(*args, **kw):
        args[0].client_session['test'] = True
        logged_in = 0
        if logged_in:
            return f(*args, **kw)  # Call hello
        else:
            return redirect(url_for('login'))
    return wrapper

【讨论】:

完美!我使用的是“暴露”装饰器中使用的不同语法 - 我不确定我是否理解替代语法。【参考方案2】:

kwargs 是一个字典,包含作为键的参数和作为值的值。

所以您需要做的就是检查: some_var = kw['my_property']

【讨论】:

这仅在通过 dict 调用函数时才有效? @OliCrt 是的。如果函数被称为 decorated_func(a, b, c),kwargs 将为空。

以上是关于Python - 在装饰器中获取原始函数参数的主要内容,如果未能解决你的问题,请参考以下文章

python_如何定义带参数的装饰器?

python装饰器获取内部函数的变量值

python装饰器获取内部函数的变量值

python基础第19回 多层,有参装饰器 递归 二分法

python_如何修改装饰器中参数?

如何将装饰器中的变量传递给装饰函数中的函数参数?