关于Python:Python – 在decorator中获取原始函数参数

Python - Get original function arguments in decorator

我正在尝试为wsgi+werkzeug应用程序中的视图编写一个"需要登录"装饰器。

为了做到这一点,我需要访问用户的会话,该会话可以通过传递到视图方法中的请求对象进行访问。

但是,我不知道如何在装饰器中得到这个请求实例。我看了PEP318,特别是第四个例子,但我不太明白。

以下是我的尝试:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
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]时得到了一个超出界限的索引错误。

有没有任何方法可以访问"loginu required"修饰符中传递给"hello"函数的请求参数?


decorator login_required传递函数(在本例中为hello)。

所以你想做的是:

1
2
3
4
5
6
7
8
9
10
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


kwargs是一个字典,其中参数作为键,值作为值。

所以你需要做的就是检查:埃多克斯1〔3〕