Python 如何使用APIView设置每个处理程序函数的权限?

Python 如何使用APIView设置每个处理程序函数的权限?,python,django,django-rest-framework,permissions,Python,Django,Django Rest Framework,Permissions,我正在使用Django和Django Rest框架为一个与学校相关的小项目编写API。我正在试图找出权限 我将APIView用于我的视图,并且希望在不编写更多视图的情况下为每个处理程序方法设置不同的权限 以下是我的博客模块的一个视图: (此视图用于/posts/) from.serializers导入* 从django.db.models导入案例,当 从rest_framework.views导入APIView 来自rest\u framework.response导入响应 从rest\u fr

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

我将APIView用于我的视图,并且希望在不编写更多视图的情况下为每个处理程序方法设置不同的权限

以下是我的博客模块的一个视图:

(此视图用于
/posts/

from.serializers导入*
从django.db.models导入案例,当
从rest_framework.views导入APIView
来自rest\u framework.response导入响应
从rest\u framework.decorators导入权限\u类
从rest_框架导入状态,权限
#在这里创建您的视图。
类PostList(APIView):
"""
要列出帖子的API端点
方法:获取、发布
"""
@权限\u类([permissions.AllowAny,])
def get(自我、请求、格式=无):
posts=Post.objects.all()
serializer=PostSerializer(posts,many=True)
返回响应(serializer.data,status=status.HTTP\u 200\u OK)
@权限\u类([permissions.IsAuthenticated])
def post(自我、请求、格式=无):
序列化程序=后创建序列化程序(数据=request.data)
如果序列化程序.u有效():
obj=serializer.save()
data=serializer.data
数据[“id”]=对象id
返回响应(数据,状态=status.HTTP\u 201\u已创建)
返回响应(status=status.HTTP\u 400\u BAD\u请求)
当前的默认设置是
权限。我已验证
,但更改该设置不一定会有帮助,因为我仍然需要单独更改某些权限

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

做这件事的正确方法是什么。。。如果有


编辑:虽然我对自己的问题给出了答案,但我仍然想知道是否还有其他正确的方法来解决这个问题。

我找到了一个解决方案,尽管我不确定这是否是最好的方法

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

从rest\u framework.views导入APIView
类CustomAPIView(APIView):
def get_权限(自我):
#实例并返回视图所需的权限。
返回{key:[permission()表示权限中的权限]对于key,表示self.permission\u classes.items()中的权限
def检查_权限(自我、请求):
#获取请求方法和权限dict,并检查在密钥匹配中定义的权限
#方法。
method=request.method.lower()
获取self.get_permissions()[method]中的权限:
如果没有权限,则具有\u权限(请求,自我):
自我许可被拒绝(
请求,消息=getattr(权限,“消息”,无)
)
然后我们使用这个
CustomAPIView
来写出视图,并使用dict来表示
permission\u类
,其中键是方法

例如:

#在此处创建视图。
类PostList(CustomAPIView):
"""
要列出帖子的API端点
方法:获取、发布
"""
权限\类={“获取”:[permissions.AllowAny],“发布”:[permissions.IsAuthenticated]}
def get(自我、请求、格式=无):
posts=Post.objects.all()
serializer=PostSerializer(posts,many=True)
返回响应(serializer.data,status=status.HTTP\u 200\u OK)
def post(自我、请求、格式=无):
序列化程序=后创建序列化程序(数据=request.data)
如果序列化程序.u有效():
obj=serializer.save()
data=serializer.data
数据[“id”]=对象id
返回响应(数据,状态=status.HTTP\u 201\u已创建)
返回响应(status=status.HTTP\u 400\u BAD\u请求)

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

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

从rest\u framework.views导入APIView
类CustomAPIView(APIView):
def get_权限(自我):
#实例并返回视图所需的权限。
返回{key:[permission()表示权限中的权限]对于key,表示self.permission\u classes.items()中的权限
def检查_权限(自我、请求):
#获取请求方法和权限dict,并检查在密钥匹配中定义的权限
#方法。
method=request.method.lower()
获取self.get_permissions()[method]中的权限:
如果没有权限,则具有\u权限(请求,自我):
自我许可被拒绝(
请求,消息=getattr(权限,“消息”,无)
)
然后我们使用这个
CustomAPIView
来写出视图,并使用dict来表示
permission\u类
,其中键是方法

例如:

#在此处创建视图。
类PostList(CustomAPIView):
"""
要列出帖子的API端点
方法:获取、发布
"""
权限\类={“获取”:[permissions.AllowAny],“发布”:[permissions.IsAuthenticated]}
def get(自我、请求、格式=无):
posts=Post.objects.all()
serializer=PostSerializer(posts,many=True)
返回响应(serializer.data,status=status.HTTP\u 200\u OK)
def post(自我、请求、格式=无):
序列化程序=后创建序列化程序(数据=request.data)
如果序列化程序.u有效():
obj=serializer.save()
data=serializer.data
数据[“id”]=对象id
返回响应(数据,状态=status.HTTP\u 201\u已创建)
返回响应(status=status.HTTP\u 400\u BAD\u请求)