2012-03-01 183 views
6

根据https://stackoverflow.com/a/8715790/210481中的一条评论,我同意,如果一个依赖于其他装饰器,我们应该避免使用多个装饰器。Django:在其他装饰器中重新使用login_required装饰器

所以,在这个例子中,如果我们有一个装饰器“active_required”用于活动用户,我们不应该在同一个视图上同时使用active_required和login_required。

我们应该有“login_required”装饰器“调用”在“active_required”之内。

是否有可能使用django附带的标准“login_required”装饰器来完成它?

我的要求是: 1)如果用户没有通过验证,我应该重定向他LOGIN_URL 2)如果用户进行身份验证(通过login_required),但不活跃,我要他重定向到一个页面“重新激活”,他的帐户 3)如果用户进行身份验证并激活,用户可以访问视图提前

感谢

+0

因为你想在3个可能的情况下有不同的行为,有两个装饰看起来不错 – second 2012-03-01 19:11:29

+0

正如我所说的,你只想用一个装饰器而不是两个做两个不同的测试? – sergzach 2012-03-01 19:27:48

+0

我想要2个不同的行为,但一个取决于另一个。 @ChrisPratt,当我想到这件事时,我在看你的评论。只有用户名和密码匹配时,标准登录功能才会检查“活动”标志。我可以考虑其他例子:在我的网站中,用户可以创建列表,只有列表的所有者可以编辑列表,因此我需要检查用户是否已登录,以及它是否为列表的所有者。这只是另一个例子。 – duduklein 2012-03-01 20:42:41

回答

8

在考虑你的问题,我发现它更容易地创建一个简单的active_required装饰者第一。这很容易,因为我们可以使用django.contrib.auth.decorators中的user_passes_test函数。

然后问题变成“我如何将login_requiredactive_required组合成一个装饰器?”。我们需要定义一个函数:

  1. 需要一个浏览功能,因为它的参数
  2. 既适用装饰以它来创建一个新的视图功能
  3. 回报新视图功能

把这一切,你有以下几点:

from django.contrib.auth.decorators import user_passes_test, login_required 

active_required = user_passes_test(lambda u: u.is_active, login_url=REACTIVATE_URL) 

def active_and_login_required(view_func): 
    decorated_view_func = login_required(active_required(view_func)) 
    return decorated_view_func 
相关问题