"list"、"create"、"retrieve"、"update" 的 ModelViewset 方法中的每个方法使用装饰器的不同权限
Different Permissions using decorators for each methods inside ModelViewset methods for "list", "create" , "retrieve", "update"
我想使用装饰器为 ModelViewset class 的不同方法添加不同的权限。
我试过了:
class abcd(viewsets.ModelViewSet):
@permission_classes(IsAuthenticated,))
def list(self, request, format=None):
try:
@permission_classes(CustomPermission,))
def create(self, request, format=None):
try:
但它不起作用。
我也尝试使用 @method_decorator
。那也没用。
我知道我们可以通过以下方式进行:
def get_permissions(self):
if self.action == 'create':
return [IsAuthenticated(), ]
return super(abcd, self).get_permissions()
但我想知道我们是否可以使用 Django Rest Framework 的装饰器来实现这一点。
ModelViewSet
继承了Mixin
类和GenericAPIView
。 list
和 create
方法来自 Mixins,因此用 permission_classes
装饰是行不通的。相反,您可以尝试覆盖 APIView
.
中的 get_permissions
def get_permissions(self):
if self.request.method == "GET":
return [IsAuthenticated()]
elif self.request.method == "POST":
return [CustomPermission()]
return [permission() for permission in self.permission_classes]
注意:我不确定上面的代码是否有效
官方页面显示了示例代码。
所以最好不要使用 self.request.method 但 self.aciton 属性.
def get_permissions(self):
"""
Instantiates and returns the list of permissions that this view requires.
"""
if self.action == 'list':
permission_classes = [IsAuthenticated]
else:
permission_classes = [IsAdmin]
return [permission() for permission in permission_classes]
https://www.django-rest-framework.org/api-guide/viewsets/#introspecting-viewset-actions
我想使用装饰器为 ModelViewset class 的不同方法添加不同的权限。
我试过了:
class abcd(viewsets.ModelViewSet):
@permission_classes(IsAuthenticated,))
def list(self, request, format=None):
try:
@permission_classes(CustomPermission,))
def create(self, request, format=None):
try:
但它不起作用。
我也尝试使用 @method_decorator
。那也没用。
我知道我们可以通过以下方式进行:
def get_permissions(self):
if self.action == 'create':
return [IsAuthenticated(), ]
return super(abcd, self).get_permissions()
但我想知道我们是否可以使用 Django Rest Framework 的装饰器来实现这一点。
ModelViewSet
继承了Mixin
类和GenericAPIView
。 list
和 create
方法来自 Mixins,因此用 permission_classes
装饰是行不通的。相反,您可以尝试覆盖 APIView
.
get_permissions
def get_permissions(self):
if self.request.method == "GET":
return [IsAuthenticated()]
elif self.request.method == "POST":
return [CustomPermission()]
return [permission() for permission in self.permission_classes]
注意:我不确定上面的代码是否有效
官方页面显示了示例代码。
所以最好不要使用 self.request.method 但 self.aciton 属性.
def get_permissions(self):
"""
Instantiates and returns the list of permissions that this view requires.
"""
if self.action == 'list':
permission_classes = [IsAuthenticated]
else:
permission_classes = [IsAdmin]
return [permission() for permission in permission_classes]
https://www.django-rest-framework.org/api-guide/viewsets/#introspecting-viewset-actions