gpt4 book ai didi

django - 在哪里检查 Django CBV 中的 403?

转载 作者:行者123 更新时间:2023-12-02 04:21:38 24 4
gpt4 key购买 nike

我正在制作一个基本的应用程序来教授初学者。每个用户都可以写笔记,但我想让一个用户无法查看或更新其他用户的笔记。

我有以下观点,但我不得不重复一遍。

from django.core.exceptions import PermissionDenied

...

class NoteUpdate(LoginRequiredMixin, UpdateView):

...

def get(self, request, *args, **kwargs):
self.object = self.get_object()

if self.object.owner != self.request.user:
raise PermissionDenied

return super(NoteUpdate, self).get(request, *args, **kwargs)

def post(self, request, *args, **kwargs):
self.object = self.get_object()

if self.object.owner != self.request.user:
raise PermissionDenied

return super(NoteUpdate, self).post(request, *args, **kwargs)

我觉得可能有一种方法可以做到这一点,而无需重复自己。是的,我可以编写这样的方法并从两者中调用它:

def check_permission(self):
if self.object.owner != self.request.user:
raise PermissionDenied

但我真正的意思是我是否覆盖了错误的方法?有没有更传统的方法来做到这一点?重写 .get() 和 .post() 感觉有点奇怪

最佳答案

回答你的问题:覆盖 .get().post() 很好,因为出于安全和完整性原因,你会想要你的 get()post() View 在显示(尤其是修改数据)之前进行验证。现在,如果您想在 get 或 post 中重构执行此操作,有两种简单的方法可以执行此操作:

主要(模型方法):

模型.py

class Model(models.Model):
owner = models.ForeignKey(User)
...

def deny_if_not_owner(self, user):
if self.owner != user:
raise PermissionDenied
return self.owner

View .py

class NoteUpdate(LoginRequiredMixin, UpdateView):
...

def get(self, request, *args, **kwargs):
self.object = self.get_object()

self.object.deny_if_not_owner(request.user)

return super(NoteUpdate, self).get(request, *args, **kwargs)

def post(self, request, *args, **kwargs):
self.object = self.get_object()

self.object.deny_if_not_owner(request.user)

return super(NoteUpdate, self).post(request, *args, **kwargs)

///////

替代方案(Mixin):

如果您将来再次使用此验证,创建 Mixin 将允许您轻松地将此代码添加到许多类中。

class DenyWrongUserMixin(object):
def get(self):
if self.object.owner != self.request.user:
raise PermissionDenied
return super(DenyWrongUserMixin, self).get(*args, **kwargs)

def post(self):
if self.object.owner != self.request.user:
raise PermissionDenied
return super(DenyWrongUserMixin, self).post(*args, **kwargs)

然后:

class NoteUpdate(LoginRequiredMixin, DenyWrongUserMixin, UpdateView):

...

def get(self, request, *args, **kwargs):
...

def post(self, request, *args, **kwargs):
...

关于django - 在哪里检查 Django CBV 中的 403?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30066459/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com