6

根据我同意的https://stackoverflow.com/a/8715790/210481中的评论之一,如果一个依赖于另一个,我们应该避免使用多个装饰器。

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

我们应该在“active_required”中以某种方式“调用”“login_required”装饰器。

是否可以使用 django 附带的标准“login_required”装饰器来做到这一点?

我的要求是: 1)如果用户未通过身份验证,我应该将他重定向到 LOGIN_URL 2)如果用户通过身份验证(通过 login_required)但未激活,我应该将他重定向到一个页面以“重新激活”他帐户 3) 如果用户已通过身份验证并处于活动状态,则用户可以访问视图

提前致谢

4

1 回答 1

8

在考虑您的问题时,我发现首先创建一个简单的active_required装饰器更容易。这很容易,因为我们可以user_passes_test使用django.contrib.auth.decorators.

然后问题变为“如何将login_requiredand组合active_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
于 2012-03-01T21:36:20.047 回答