gpt4 book ai didi

python - 如何使用 APIView 设置每个处理函数的权限?

转载 作者:行者123 更新时间:2023-12-02 00:05:03 27 4
gpt4 key购买 nike

我正在使用 Django 和 Django-Rest-Framework 为一个与学校相关的小型项目编写 API。我正在尝试找出权限。

我正在为我的 View 使用 APIView,并希望在不编写更多 View 的情况下为每个处理程序方法设置不同的权限。

这是我拥有的博客模块的 View 之一:

(此 View 用于/posts/)

from .serializers import *
from django.db.models import Case, When
from rest_framework.views import APIView
from rest_framework.response import Response
from rest_framework.decorators import permission_classes
from rest_framework import status, permissions


# Create your views here.
class PostList(APIView):
"""
API Endpoint to List Posts
METHODS: GET, POST
"""

@permission_classes([permissions.AllowAny,])
def get(self, request, format=None):
posts = Post.objects.all()
serializer = PostSerializer(posts, many=True)
return Response(serializer.data, status=status.HTTP_200_OK)

@permission_classes([permissions.IsAuthenticated])
def post(self, request, format=None):
serializer = PostCreationSerializer(data=request.data)
if serializer.is_valid():
obj = serializer.save()
data = serializer.data
data["id"] = obj.id
return Response(data, status=status.HTTP_201_CREATED)
return Response(status=status.HTTP_400_BAD_REQUEST)

当前的默认设置是 permissions.IsAuthenticated,但更改它不一定有帮助,因为我仍然需要单独更改一些权限。

所以我应该能够在未对 /posts/ 进行身份验证的情况下发出 GET 请求并获取所有帖子的列表,而我应该从对 /的 POST 请求中获得 401帖子/。但是,即使是 GET 请求也会返回 401 状态代码。

正确的方法是什么...如果有的话。

编辑:虽然我提供了我自己问题的答案,但我仍然想知道是否有更正确的方法来解决这个问题。

最佳答案

我想出了一个解决方案,但我不确定这是最好的方法。

首先,我们创建一个APIView的子类:

from rest_framework.views import APIView


class CustomAPIView(APIView):
def get_permissions(self):
# Instances and returns the dict of permissions that the view requires.
return {key: [permission() for permission in permissions] for key, permissions in self.permission_classes.items()}

def check_permissions(self, request):
# Gets the request method and the permissions dict, and checks the permissions defined in the key matching
# the method.
method = request.method.lower()
for permission in self.get_permissions()[method]:
if not permission.has_permission(request, self):
self.permission_denied(
request, message=getattr(permission, 'message', None)
)

然后我们使用这个 CustomAPIView 写出 View ,并为 permission_classes 使用字典,其中键是方法。

例子:

# Create your views here.
class PostList(CustomAPIView):
"""
API Endpoint to List Posts
METHODS: GET, POST
"""
permission_classes = {"get": [permissions.AllowAny], "post": [permissions.IsAuthenticated]}

def get(self, request, format=None):
posts = Post.objects.all()
serializer = PostSerializer(posts, many=True)
return Response(serializer.data, status=status.HTTP_200_OK)

def post(self, request, format=None):
serializer = PostCreationSerializer(data=request.data)
if serializer.is_valid():
obj = serializer.save()
data = serializer.data
data["id"] = obj.id
return Response(data, status=status.HTTP_201_CREATED)
return Response(status=status.HTTP_400_BAD_REQUEST)

关于python - 如何使用 APIView 设置每个处理函数的权限?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60907644/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com