我有一些用户可以看到某个视图.
为了让用户登录并抱怨了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
标志由两个LoginRequiredMixin
和PermissionRequiredMixin
,我不能将其设置为任何东西.
如果raise_exception
是True
,则未登录的用户收到403 Forbidden
(我不想要).
如果raise_exception
是False
,那就是用户没有允许看到的视图,将被重定向到登录页面使用它,因为用户登录时,将再次重定向到该页面.创建一个完全没有花哨的重定向循环.
当然我可以实现我自己的mixin行为我期望的行为,但是在视图本身中是否有任何Django方式?(不在urls.py
)
对于许多未经身份验证的用户筹集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)