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

55 投票
2 回答
43265 浏览
提问于 2025-04-15 12:19

我正在尝试为WSGI+Werkzeug应用程序中的视图写一个“登录必需”的装饰器。

为了做到这一点,我需要获取用户的会话信息,这些信息可以通过传递给视图方法的请求对象来访问。

但是,我不知道如何在装饰器中获取这个请求对象的实例。我查看了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]时遇到了索引超出范围的错误。

有没有办法让我在“登录必需”的装饰器中访问传递给“hello”函数的请求参数呢?

2 个回答

7

kwargs 是一个字典,里面的内容是参数,参数名是键,参数值是值。

所以你只需要检查一下: some_var = kw['my_property']

70

装饰器 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

撰写回答