当前位置:  开发笔记 > 后端 > 正文

可以将PermissionRequiredMixin和LoginRequiredMixin合并吗?

如何解决《可以将PermissionRequiredMixin和LoginRequiredMixin合并吗?》经验,为你挑选了1个好方法。

我有一些用户可以看到某个视图.

为了让用户登录并抱怨了403 Forbidden为这些用户不能看到登录,我可以使用下面的(如解释在这里):

@permission_required('polls.can_vote', raise_exception=True)
@login_required
def my_view(request):
    ...

这确实按预期工作.但我的所有观点都是基于类的观点.自从Django 1.9(最终!)以来,有很多漂亮的mixins用于处理只能通过装饰器完成的事情.然而...

class MyClassView(LoginRequiredMixin, PermissionRequiredMixin, TemplateView):
    raise_exception = 
    permission_required = 'polls.can_vote'
    template_name = 'poll_vote.html'

这不起作用.由于该raise_exception标志由两个LoginRequiredMixinPermissionRequiredMixin,我不能将其设置为任何东西.

如果raise_exceptionTrue,则未登录的用户收到403 Forbidden(我不想要).

如果raise_exceptionFalse,那就是用户没有允许看到的视图,将被重定向到登录页面使用它,因为用户登录时,将再次重定向到该页面.创建一个完全没有花哨的重定向循环.

当然我可以实现我自己的mixin行为我期望的行为,但是在视图本身中是否有任何Django方式?(不在urls.py)



1> Alex Morozov..:

对于许多未经身份验证的用户筹集403的情况是预期的行为.所以,是的,你需要一个自定义mixin:

class LoggedInPermissionsMixin(PermissionRequiredMixin):
     def dispatch(self, request, *args, **kwargs):
        if not self.request.user.is_authenticated():
            return redirect_to_login(self.request.get_full_path(),
                                     self.get_login_url(), self.get_redirect_field_name())
        if not self.has_permission():
            # We could also use "return self.handle_no_permission()" here
            raise PermissionDenied(self.get_permission_denied_message())
        return super(LoggedInPermissionsMixin, self).dispatch(request, *args, **kwargs)

推荐阅读
黄晓敏3023
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有