【问题标题】:Django UserPassesTestMixin confusion/questions?Django UserPassesTestMixin 混淆/问题?
【发布时间】:2021-03-22 06:23:47
【问题描述】:

我目前正在开发一个管理仪表板,其中包括仅针对公司管理员的特定视图,这些视图标记为Business 用户。

该应用将获得大约 10 次浏览,我对UserPassesTestMixin 有几个问题

基本上,我所有的观点都会包括这个,

def test_func(self):
    return self.request.user.user_type == 'Business'

为了确保用户是Business 用户,我以这种方式保护视图。

我自己无法解决的几个问题是:

现在重复说 10 次,有没有更清洁的方法来做到这一点,而不是让 def test_func 在每个 CBV 中?

出现的另一个问题是,如果用户没有通过测试,它会重定向到登录页面,我也不是很喜欢。这些视图都返回 json。如果用户没有通过测试,我只想将他们发送到类似的地方,

JsonResponse({'message': 'Only company administrators have access to this view'})

如果用户没有通过测试,我如何才能更改该重定向?请记住,这些视图也继承自 LoginRequiredMixin,如果用户未登录,我希望保持原始重定向到登录页面的完整性。

非常感谢您对此的任何帮助。 Django 的这一面对我来说是相当新的东西!

【问题讨论】:

    标签: django django-views django-class-based-views django-permissions


    【解决方案1】:

    现在重复说 10 次,有没有更简洁的方法来做到这一点,而不是在每个 CBV 中都有 def test_func

    是的,您可以简单地制作一个实现检查的mixin:

    from django.contrib.auth.mixins import UserPassesTestMixin
    
    class BusinessUserMixin(LoginRequiredMixin, UserPassesTestMixin):
        
        def test_func(self):
            return self.request.user.user_type == 'Business'
    
        def handle_no_permission(self):
            return JsonResponse(
                {'message': 'Only company administrators have access to this view'}
            )

    然后你在你的视图中使用这个 mixin,例如:

    class MyView1(BusinessUserMixin, ListView):
        # …
        pass
    
    class MyView2(BusinessUserMixin, DetailView):
        # …
        pass
    
    class MyView3(BusinessUserMixin, CreateView):
        # …
        pass

    如果用户没有通过测试,它会重定向到登录页面,我也不是很喜欢。这些视图都返回 json。如果用户没有通过测试,我想把他们送到类似的地方。

    你也可以重写handle_no_permission方法,当测试失败时视图会返回这个方法的结果。

    【讨论】:

    • 太棒了!这正是我一直在寻找的。再次非常非常感谢您!
    猜你喜欢
    • 1970-01-01
    • 2015-06-14
    • 1970-01-01
    • 1970-01-01
    • 2020-07-12
    • 1970-01-01
    • 1970-01-01
    • 2011-01-06
    相关资源
    最近更新 更多