Django REST Framework-常用的权限类型

2023-04-25 09:02:47 浏览数 (1)

Django REST Framework是一个用于构建Web API的强大框架。其中一个重要的特性是提供了多种权限类型来控制用户对API端点的访问。

常用的权限类型

  1. IsAuthenticated:只允许已经验证身份的用户访问API端点。
  2. IsAdminUser:只允许管理员用户访问API端点。
  3. AllowAny:允许任何用户访问API端点,包括未经身份验证的用户。
  4. IsAuthenticatedOrReadOnly:允许任何用户读取API端点,但只有已经验证身份的用户才能够写入数据。
  5. DjangoModelPermissions:基于Django模型的权限控制。允许用户在执行特定操作之前检查模型的权限。例如,如果您的模型有一个“更改”权限,只有具有“更改”权限的用户才能够修改该模型的实例。
  6. DjangoModelPermissionsOrAnonReadOnly:如果用户未经身份验证,则允许读取API端点。如果用户已经验证身份,则检查该用户是否具有执行特定操作的模型权限。
  7. DjangoObjectPermissions:允许用户在执行特定操作之前检查模型实例的权限。例如,如果一个用户只有对一个特定的模型实例的“更改”权限,那么该用户只能够修改该实例。
  8. DjangoObjectPermissionsOrAnonReadOnly:如果用户未经身份验证,则允许读取API端点。如果用户已经验证身份,则检查该用户是否具有执行特定操作的模型实例权限。

如何使用权限

Django REST Framework的权限通常通过将它们附加到视图类中来使用。您可以通过将类变量permission_classes设置为适当的权限类列表来指定要使用的权限。例如,以下代码演示了如何使用IsAuthenticated权限:

代码语言:javascript复制
from rest_framework.permissions import IsAuthenticated
from rest_framework.views import APIView
from rest_framework.response import Response

class MyView(APIView):
    permission_classes = [IsAuthenticated]

    def get(self, request):
        content = {'message': 'Hello, World!'}
        return Response(content)

这个视图只允许已经验证身份的用户访问。如果一个未经身份验证的用户尝试访问这个视图,他们将会被重定向到登录页面。

示例

以下是一个更完整的示例,展示如何在Django REST Framework中使用权限。假设我们有一个名为Snippet的模型,它表示代码片段,我们希望只有创建该代码片段的用户才能够修改或删除它。我们可以使用DjangoObjectPermissions来实现这一点。

首先,我们需要定义一个权限类来检查用户是否有访问代码片段的权限:

代码语言:javascript复制
from rest_framework import permissions
from rest_framework.views import APIView
from rest_framework.response import Response
from snippets.models import Snippet
from snippets.serializers import SnippetSerializer


class IsOwnerOrReadOnly(permissions.BasePermission):
    """
    自定义权限,只允许拥有该对象的所有者进行修改或删除
    """

    def has_object_permission(self, request, view, obj):
        if request.method in permissions.SAFE_METHODS:
            return True

        return obj.owner == request.user


class SnippetDetail(APIView):
    """
    获取,更新或删除一个代码片段实例。
    """

    permission_classes = [IsOwnerOrReadOnly]

    def get_object(self, pk):
        try:
            return Snippet.objects.get(pk=pk)
        except Snippet.DoesNotExist:
            raise Http404

    def get(self, request, pk, format=None):
        snippet = self.get_object(pk)
        serializer = SnippetSerializer(snippet)
        return Response(serializer.data)

    def put(self, request, pk, format=None):
        snippet = self.get_object(pk)
        serializer = SnippetSerializer(snippet, data=request.data)
        if serializer.is_valid():
            serializer.save(owner=self.request.user)
            return Response(serializer.data)
        return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)

    def delete(self, request, pk, format=None):
        snippet = self.get_object(pk)
        snippet.delete()
        return Response(status=status.HTTP_204_NO_CONTENT)

在上面的示例中,我们定义了一个名为IsOwnerOrReadOnly的自定义权限类。这个权限类检查当前请求的用户是否是代码片段的所有者,如果是则允许修改或删除。否则,只允许读取操作。

然后,我们定义了一个名为SnippetDetail的视图类,该类允许用户获取、更新或删除一个代码片段实例。我们将IsOwnerOrReadOnly权限类添加到该视图的permission_classes属性中,以确保只有代码片段的所有者才能够修改或删除它。

put()方法中,我们使用self.request.user将当前请求的用户设置为代码片段的所有者。这样,如果用户成功更新代码片段,他们就会成为该代码片段的新所有者。

0 人点赞