我正在尝试为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”函数的request参数?
答案 0 :(得分:33)
装饰器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 :(得分:3)
kwargs
是一个字典,包含参数作为键,值作为值。
所以你需要做的就是检查:
some_var = kw['my_property']