Django REST Framework是一个用于构建Web API的强大框架。其中一个重要的特性是提供了多种权限类型来控制用户对API端点的访问。
Django REST Framework的权限通常通过将它们附加到视图类中来使用。您可以通过将类变量permission_classes设置为适当的权限类列表来指定要使用的权限。例如,以下代码演示了如何使用IsAuthenticated权限:
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来实现这一点。
首先,我们需要定义一个权限类来检查用户是否有访问代码片段的权限:
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将当前请求的用户设置为代码片段的所有者。这样,如果用户成功更新代码片段,他们就会成为该代码片段的新所有者。