如何配置Django REST Framework,让作者仅查看并编辑自己的帖子?
实现每个作者仅查看自己帖子的DRF权限方案
要实现只有作者能查看和编辑自己的帖子,我们需要同时调整权限类和视图逻辑——原来的权限类只控制了对象级的修改权限,列表视图还会默认返回所有数据,得配套修改才行:
1. 修改IsAuthorOrReadOnly权限类
原权限类对GET这类安全方法直接放行,导致任何人都能查看任意帖子。我们要把安全方法的权限也限制为仅作者可见:
from rest_framework import permissions class IsAuthorOrReadOnly(permissions.BasePermission): def has_permission(self, request, view): # 仅登录用户能访问所有接口 return request.user.is_authenticated def has_object_permission(self, request, view, obj): # 不管是查看还是修改,都必须是帖子的作者本人 return obj.author == request.user
2. 调整视图类的查询范围
光改权限类还不够,列表视图默认会返回所有Task对象。我们需要重写get_queryset方法,让每个用户只能拉取自己创建的帖子:
from rest_framework import generics from .models import Task from .serializers import TaskSerializer from .permissions import IsAuthorOrReadOnly class TaskList(generics.ListCreateAPIView): permission_classes = (IsAuthorOrReadOnly,) serializer_class = TaskSerializer def get_queryset(self): # 仅返回当前登录用户创建的Task return Task.objects.filter(author=self.request.user) class TaskDetail(generics.RetrieveUpdateDestroyAPIView): permission_classes = (IsAuthorOrReadOnly,) serializer_class = TaskSerializer def get_queryset(self): # 同样限制查询集,配合权限类做双重安全校验 return Task.objects.filter(author=self.request.user)
补充说明
- 为什么要同时修改查询集和权限类?
- 修改查询集是为了减少不必要的数据加载,避免把其他用户的帖子拉到内存里,提升接口性能;
- 权限类是最后一道安全防线,防止有人通过手动构造URL访问不属于自己的帖子详情。
内容的提问来源于stack exchange,提问作者Ulan
相关产品推荐
相关产品推荐

