我有一些用户可以看到某个视图.
为了让用户登录并抱怨了403 Forbidden为这些用户不能看到登录,我可以使用下面的(如解释在这里):
@permission_required('polls.can_vote', raise_exception=True)
@login_required
def my_view(request):
...
Run Code Online (Sandbox Code Playgroud)
这确实按预期工作.但我的所有观点都是基于类的观点.自从Django 1.9(最终!)以来,有很多漂亮的mixins用于处理只能通过装饰器完成的事情.然而...
class MyClassView(LoginRequiredMixin, PermissionRequiredMixin, TemplateView):
raise_exception = <???>
permission_required = 'polls.can_vote'
template_name = 'poll_vote.html'
Run Code Online (Sandbox Code Playgroud)
这不起作用.由于该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)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3059 次 |
| 最近记录: |