根据 https://stackoverflow.com/a/8715790/210481 中的评论之一,我同意,如果一个依赖于另一个,我们应该避免使用多个装饰器。
因此,在示例中,如果我们有一个用于事件用户的装饰器“active_required”,我们就不必在同一个 View 中同时使用 active_required 和 login_required。
我们应该在“active_required”装饰器中以某种方式“调用”“login_required”装饰器。
是否可以使用 django 附带的标准“login_required”装饰器来实现?
我的要求是:
1)如果用户未通过身份验证,我应该将他重定向到 LOGIN_URL
2)如果用户已通过身份验证(通过 login_required),但未处于事件状态,我应该将他重定向到一个页面以“重新激活”他的帐户
3) 如果用户通过身份验证且处于事件状态,则用户可以访问 View
提前致谢
最佳答案
在考虑您的问题时,我发现创建一个简单的 active_required
更容易首先是装饰器。这很容易,因为我们可以使用 user_passes_test
函数在 django.contrib.auth.decorators
.
然后问题变为“如何将 login_required
和 active_required
组合成一个装饰器?”。我们需要定义一个函数:
把它们放在一起,你有以下几点:
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
关于Django:在其他装饰器中重用 login_required 装饰器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9521966/