如何在 DRF ViewSet 中完全不允许 PUT 方法但允许 PATCH?

2024-02-07

PUT and PATCH都是同一个 mixin 的一部分(更新模型混合 http://www.django-rest-framework.org/api-guide/generic-views/#updatemodelmixin).

所以如果我像这样扩展它:

class UserViewSet(mixins.UpdateModelMixin, GenericViewSet):
    queryset = User.objects.all()
    serializer_class = UserSerializer

Both PUT and PATCH被允许。我不想允许PUT完全适合我的应用程序(因为PATCH已经完成了工作,我想仅使用限制对象创建POST)。一种方法是创建权限:

class NoPut(permissions.BasePermission):
    """
    PUT not allowed.
    """
    message = 'You do not have permission to complete the action you are trying to perform.'

    def has_object_permission(self, request, view, obj):
        if view.action == "update":
            return False
        return True

并将此权限授予我所有允许的 ViewSetsPATCH。这是最好的方法吗?有更优选的方式吗?

编辑:查看@wim 提供的答案后,这是否是一个很好的解决方案(除了映射之外,一切都保持不变)put去掉了):

from rest_framework.routers import SimpleRouter
class NoPutRouter(SimpleRouter):

    routes = [
        # List route.
        Route(
            url=r'^{prefix}{trailing_slash}$',
            mapping={
                'get': 'list',
                'post': 'create'
            },
            name='{basename}-list',
            initkwargs={'suffix': 'List'}
        ),
        # Dynamically generated list routes.
        # Generated using @list_route decorator
        # on methods of the viewset.
        DynamicListRoute(
            url=r'^{prefix}/{methodname}{trailing_slash}$',
            name='{basename}-{methodnamehyphen}',
            initkwargs={}
        ),
        # Detail route.
        Route(
            url=r'^{prefix}/{lookup}{trailing_slash}$',
            mapping={
                'get': 'retrieve',
                 # put removed
                'patch': 'partial_update',
                'delete': 'destroy'
            },
            name='{basename}-detail',
            initkwargs={'suffix': 'Instance'}
        ),
        # Dynamically generated detail routes.
        # Generated using @detail_route decorator on methods of the viewset.
        DynamicDetailRoute(
            url=r'^{prefix}/{lookup}/{methodname}{trailing_slash}$',
            name='{basename}-{methodnamehyphen}',
            initkwargs={}
        ),
    ]

或者我需要重新定义其他方法SimpleRoute (e.g. __init()__, get_routes(), _get_dynamic_routes(), get_method_map()等)以便其正常工作?


如果你想使用内置的mixins.UpdateModelMixin, 限制于PATCH并禁用 swagger 显示您可以使用的 PUThttp_method_names

class UserViewSet(mixins.UpdateModelMixin, GenericViewSet):
    queryset = User.objects.all()
    serializer_class = UserSerializer
    http_method_names = ["patch"]
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在 DRF ViewSet 中完全不允许 PUT 方法但允许 PATCH? 的相关文章

随机推荐