use*_*132 2 django django-views django-class-based-views
我正在制作一个基本的应用程序来教初学者。每个用户都可以写笔记,但我想让用户无法查看或更新不同用户的笔记。
我有以下观点,但我不得不重复一遍。
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)
Run Code Online (Sandbox Code Playgroud)
我觉得可能有一种方法可以在不重复自己的情况下做到这一点。是的,我可以编写一个这样的方法并从两者中调用它:
def check_permission(self):
if self.object.owner != self.request.user:
raise PermissionDenied
Run Code Online (Sandbox Code Playgroud)
但我真正的意思是我是否覆盖了错误的方法?有没有更传统的方法来做到这一点?覆盖 .get() 和 .post() 感觉有点奇怪
回答您的问题:覆盖.get()并且.post()很好,因为出于安全性和完整性的原因,您希望在显示尤其是修改数据之前验证您的视图get()和post()视图。现在,如果您想在 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
Run Code Online (Sandbox Code Playgroud)
视图.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)
Run Code Online (Sandbox Code Playgroud)
///////
替代(混合):
如果您将来再次使用此验证,则创建 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)
Run Code Online (Sandbox Code Playgroud)
进而:
class NoteUpdate(LoginRequiredMixin, DenyWrongUserMixin, UpdateView):
...
def get(self, request, *args, **kwargs):
...
def post(self, request, *args, **kwargs):
...
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
569 次 |
| 最近记录: |