Django:在其他装饰器中重用login_required装饰器

dud*_*ein 6 django decorator login-required

根据我同意的/sf/answers/610105331/中的一条评论,我们应该避免多个装饰器,如果一个取决于另一个.

因此,在示例中,如果我们为活动用户提供了一个装饰器"active_required",我们就不必在同一视图上同时使用active_required和login_required.

我们应该在"active_required"中以某种方式"调用""login_required"装饰器.

是否可以使用django附带的标准"login_required"装饰器来完成它?

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

提前致谢

Ala*_*air 8

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

那么问题就变为"我怎么结合login_required,并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
Run Code Online (Sandbox Code Playgroud)