【发布时间】:2012-02-01 16:36:22
【问题描述】:
我正在尝试用两个装饰器来装饰 Django 视图,一个用于检查登录,一个用于检查 is_active。
第一个是内置的@login_required,第二个如下:
def active_required(function):
dec = user_passes_test(lambda u: u.is_active, '/notallowed', '')
return dec(function)
现在,Python 中的装饰器由内而外地工作,但以下内容不起作用:
@active_required
@login_required
def foo(request):
...
我想先检查用户是否登录,如果没有,则重定向到登录页面,如果他或她登录,我想检查他或她是否处于活动状态,如果没有,则执行重定向到'/notallowed'。
如果login_required失败了,用户并没有被重定向到登录页面,而是@active_required被执行了,由于这种情况下用户为null,@active_required装饰器失败,用户被重定向到@ 987654326@.
更改顺序似乎有效,
@login_required
@active_required
def foo(request):
...
但我怀疑这种方法也有问题。
组合两个装饰器的正确方法是什么,为什么执行顺序与简单的 Python 装饰器不同?
【问题讨论】: