在ViewSet中禁用一个方法,django-rest-framework

191

ViewSets具有自动方法来列出、检索、创建、更新、删除等操作...

我想禁用其中的一些方法,但我想出的解决方案可能不是一个好方法,因为 OPTIONS 仍然将它们列为允许的方法。

你有什么好的方法来正确地实现这个目标吗?

class SampleViewSet(viewsets.ModelViewSet):
    queryset = api_models.Sample.objects.all()
    serializer_class = api_serializers.SampleSerializer

    def list(self, request):
        return Response(status=status.HTTP_405_METHOD_NOT_ALLOWED)
    def create(self, request):
        return Response(status=status.HTTP_405_METHOD_NOT_ALLOWED)

参见:https://dev59.com/qVcP5IYBdhLWcg3w_ex2#69648046 - phoenix
13个回答

1
在Django Rest Framework中,Viewsets的另一种方法是启用/禁用方法。以下是一个示例api/urls.py:
    user_list = UserViewSet.as_view({
        'get': 'list'
    })
    user_detail = UserViewSet.as_view({
        'get': 'retrieve'
        'put': 'update',
        'post': 'create',
        'patch': 'partial_update',
        'delete': 'destroy'
    })


urlpatterns = [
    path('users/', user_list, name='user-list'),
    path('users/<int:pk>/', user_detail, name='user-detail')
]

查看用户列表只允许使用一个get方法,而用户详细信息可以使用所有方法。

在Django 4.0上进行测试。

参考:更多详情请点击此处


0

你可以写一个小装饰器:

def http_methods_disable(*methods):
    def decorator(cls):
        cls.http_method_names = [method for method in cls.http_method_names if method not in methods]
        return cls
    return decorator

然后它可以在不同的类中使用:

@http_methods_disable('patch', 'delete')
class SampleViewSet(viewsets.ModelViewSet):
    ...

@http_methods_disable('patch')
class AnyViewSet(viewsets.ModelViewSet):
   ...

0

只需使用GenericViewSet,在使用它们之前必须明确定义HTTP动作。有关更多信息,请参见this


通常最好包含一些代码示例。这个链接将来可能无法使用。 - Lucas Grugru

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接