我来详细讲解“Django Rest framework之权限的实现示例”的攻略。
什么是权限
在使用 Django Rest framework(以下简称 DRF)开发 Web API 的过程中,我们需要实现对 API 的访问进行权限控制,以保证数据的安全。权限可以分为两种类型:
- Object level permissions:对象级别权限,表示对某个具体对象的权限控制;
- User level permissions:用户级别权限,表示对当前用户所有访问操作的权限控制;
引入DRF的权限
DRF内置了多种权限类(permission classes),例如:AllowAny、IsAuthenticated、IsAdminUser、IsAuthenticatedOrReadOnly等。 在视图中引入 permissions 实现:
from rest_framework import permissions
class MyView(APIView):
permission_classes = [permissions.AllowAny]
可以在类定义时直接添加,也可以在方法内使用 self.permission_classes = [permissions.IsAuthenticated]
来动态变更权限。
使用自定义的权限类
可以根据实际需要,自定义权限类。 自定义权限类需要从 DRF 内置的权限基类中选择继承一个或多个,通常建议从 DRF 的 BasePermission 类继承。
例如,实现一个权限类 IsOwnerOrReadOnly
,用于控制只有该对象的 Owner 才有修改和删除的权限,其他用户只有读取的权限。
from rest_framework.permissions import BasePermission
class IsOwnerOrReadOnly(BasePermission):
"""
自定义权限类:只允许对象的 Owner 有修改和删除权限
"""
def has_object_permission(self, request, view, obj):
# 对于只读请求,允许任何人都可以访问
if request.method in permissions.SAFE_METHODS:
return True
# 只有对象的 Owner 才有修改和删除权限
return obj.owner == request.user
然后在视图中使用该权限类:
class MyView(APIView):
permission_classes = [IsOwnerOrReadOnly]
其中 request.user
获得当前请求所关联的用户对象。
示例说明
示例一:只允许管理员访问 API
为了只允许管理员来访问 API,我们可以使用 DRF 内置的 IsAdminUser
和 AllowAny
权限。
首先,导入权限类:
from rest_framework.permissions import IsAdminUser, AllowAny
然后在视图中设置 permission_classes
属性,给这个视图指定权限:
class MyAdminView(APIView):
permission_classes = [IsAdminUser]
class MyPublicView(APIView):
permission_classes = [AllowAny]
这样,在访问 MyAdminView
视图时,DRF 会检查用户是否是管理员(即数据库中标记为 is_staff
);而在访问 MyPublicView
视图时,则完全不需要任何权限验证。
示例二:只允许对象的 Owner 删除和修改
为了保证对象的安全,通常只允许该对象的 Owner 来删除或修改它。我们可以使用自定义的 IsOwnerOrReadOnly
来实现该功能。
首先,导入自定义的权限类:
from app.permissions import IsOwnerOrReadOnly
然后在视图中设置 permission_classes
属性:
class MyDetailView(APIView):
permission_classes = [IsOwnerOrReadOnly]
def get_object(self, pk):
try:
obj = MyModel.objects.get(pk=pk)
# 检查对象的 Owner 是否与当前用户一致
self.check_object_permissions(self.request, obj)
return obj
except MyModel.DoesNotExist:
raise Http404
def delete(self, request, pk, format=None):
obj = self.get_object(pk)
obj.delete()
return Response(status=status.HTTP_204_NO_CONTENT)
def put(self, request, pk, format=None):
obj = self.get_object(pk)
serializer = MyModelSerializer(obj, data=request.data)
if serializer.is_valid():
serializer.save()
return Response(serializer.data)
return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
在 MyDetailView
视图中,我们首先定义了一个 get_object
方法,用于检查对象的 Owner 是否与当前用户一致。 这里我们使用了 self.check_object_permissions
方法来检查权限,该方法来自 DRF 内置的 APIView
类。 在 delete
和 put
方法中,我们首先调用 get_object
方法来获取对象,之后再执行删除或修改操作。
这样在请求删除和修改时,DRF就会自动根据 IsOwnerOrReadOnly
的 has_object_permission
方法来检查权限了。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Django Rest framework之权限的实现示例 - Python技术站