django - 何时使用 UserPassesTestMixin 与 PermissionRequiredMixin

标签 django

在我看来,这些 mixin 可以以不同的方式实现类似的目标。我可以通过检查用户是否具有 PermissionRequiredMixin 权限来让某人访问 View ,或者我可以使用 UserPassesTest 并编写一个 test_func 来检查用户是否在特定组中,甚至检查那里的权限。
我是 Django 的新手,我不知道何时使用一种和另一种。孤立地看,我了解他们的工作,但还不足以了解他们在哪里合适。
我遇到的几种情况我不确定哪个是最好的

  • 我应该使用哪个来限制对某些 View 的访问?
  • 在用户可以创建对象的应用程序中,将这些对象的更新/删除限制为创建者
  • 最佳答案

  • PermissionRequiredMixin:验证当前用户是否具有所有指定的权限。
  • UserPassesTestMixin:如果 test_func() 拒绝带有权限错误的请求方法返回 False .

  • 顾名思义PermissionRequiredMixin只检查在 中定义的权限permission_required 属性或 get_permission_required() 方法。
    但是, UserPassesTestMixin 是非常通用的版本,它可以帮助您检查任意数量的任意条件。例如,您可以检查登录用户的电子邮件域,或任何自定义属性或值等。

    示例 1
    In this example, both are equal.
    from django.contrib.auth import mixins
    from django.views import generic
    
    
    class TestPermissionView(mixins.PermissionRequiredMixin, generic.CreateView):
        permission_required = [
            'foo.add_bar',
            'foo.change_bar'
        ]
    
    
    class TestUserTestView(mixins.UserPassesTestMixin, generic.CreateView):
        def test_func(self):
            req_perms = [
                'foo.add_bar',
                'foo.change_bar'
            ]
            
            return self.request.user.has_perms(req_perms)
    
    在这个例子中,两个类的行为方式相同
    示例 2
    class TestUserTestView(mixins.UserPassesTestMixin, generic.CreateView):
        def test_func(self):
            # this  checks the email domain of the user
            allowed_domains = ['foo.com', 'bar.co.in']
            return self.request.user.email.split('@')[1] in allowed_domains
    
    在此示例中,我们正在检查用户的电子邮件域。如您所见,此示例不能使用 PermissionRequiredMixin 重写。类(class)。

    关于django - 何时使用 UserPassesTestMixin 与 PermissionRequiredMixin,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62684582/

    相关文章:

    python - 数据库和模型仍然存在 DJango 中出现编程错误

    C# 与 Python : XML Handling/Processing Productivity

    python - Django、Virtualenv、nginx + uwsgi导入模块wsgi报错

    python - 为什么我不能在 django poll 教程第 5 部分的错误修复中使用 now 变量

    mysql - 逆向工程 mysql 数据库以创建 django 应用程序

    python - 带有 python 3.4 的 Elastic Beanstalk 仍然使用 python 2.7

    python - 如何创建我自己的 Django 登录表单

    python - 您如何向非技术客户介绍 Django [或 Ruby on Rails]

    python - Django:删除关系末尾时未触发 m2m_changed

    python - 在配置表中按行保存数据与在 Postgres JSONField 中保存为键——哪个更好?