2009-06-17 57 views
18

我正在为WSGI + Werkzeug应用程序中的视图编写“login_required”装饰器。Python - 在装饰器中获取原始函数参数

为了做到这一点,我需要获取用户的会话,该会话可通过传递给视图方法的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”函数的请求参数?

回答

23

装饰者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 
+1

完美!我使用的是“公开”装饰器中使用的不同语法 - 我不确定我是否理解备用语法。 – ashgromnies 2009-06-18 00:11:00

2

kwargs是含有参数作为键和值作为值的字典。

因此,所有你需要做的是检查: some_var = kw['my_property']