在详细路线上使用权限 class

Using a permission class on a detail route

如何才能只对详细路线应用权限class?

class EventViewSet(viewsets.ModelViewSet):

    @detail_route(methods=['post'])
    def messages(self, request, pk=None):
        ### Check a permissions class.
        ...

更新 1

从 DRF 3.8 开始,detail_route 装饰器已替换为 action 装饰器。

class EventViewSet(viewsets.ModelViewSet):
    @action(permission_classes=[permissions.PermissionClass_], methods=['post'])
    def messages(self, request, pk=None):
        # your view code

原版post

你基本上可以通过这样做来添加权限:

class EventViewSet(viewsets.ModelViewSet):
    @detail_route(
        permission_classes=[
            permissions.PermissionClass_],
        methods=['post'])
    def messages(self, request, pk=None):
        ### Check a permissions class.
        ...

如果您在 ViewSet 的自定义操作中遇到 permissions_classes 问题,请尝试在您的操作中使用此装饰器。可能最新的 Django Rest Framework 没有查看权限。这种情况的解决方案是在每个自定义操作的开头自行检查或使用以下装饰器:

def check_permissions(fun):
    def ref(self, request, pk=None):
        obj = get_object_or_404(self.get_queryset(), pk=pk)
        self.check_object_permissions(self.request, obj)

        return fun(self, request, pk)

    return ref

在 django rest 3.8 detail route 中弃用了 action route 所以现在它看起来像这样。

from rest_framework.decorators import api_view, permission_classes

class EventViewSet(viewsets.ModelViewSet):

    @action(
        methods=['post'],
        detail=True,
        permission_classes=[YourPermission]
        url_path='messages')
    def messages(self, request, pk=None):
        return Response("200", status=200)