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

标签 django decorator login-required

根据 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_requiredactive_required 组合成一个装饰器?”。我们需要定义一个函数:

  • 接受一个 View 函数作为它的参数
  • 将两个装饰器应用于它以创建一个新的 View 函数
  • 返回新的 View 函数

  • 把它们放在一起,你有以下几点:
    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/

    相关文章:

    python - 在 forloop 上向 datetime.time() django 添加 +1 小时

    python - Django 从选择元组连接

    django - 使用 django 和 wsgi 从子目录提供 wordpress 博客

    Python并测量以毫秒为单位的时间并在满足阈值时中止

    python - 拥有一个与多个不同模型相关的模型

    java - 如何检查继承链中是否存在特定的类类型

    angular - Typescript @Component "Decorator"是否与装饰器模式有关?

    python - @login_required Flask 应用程序中的问题

    python - 为什么我得到 "AttributeError: ' unicode' object has no attribute 'user' "on some specified url only only?

    python - 如何在 django settings.py 中更改 'login_required' 的默认重定向