django rest框架-仅允许某些方法

时间:2018-11-04 13:00:56

标签: django django-rest-framework

我有一个资源,我只想允许客户端对资源进行发布请求,这就是为什么我使用

class MyViewSet(mixins.CreateModelMixin, viewsets.GenericViewSet):

在我的视野中。

当我发出发布请求时,它可以正常工作。

当我发出列表请求时,它会按预期抛出405响应。

当我执行检索,放置,修补或删除方法时,它会抛出404而不是405 ...为什么?

尽管发布了请求,我如何使每个请求都返回405?

谢谢问候!

3 个答案:

答案 0 :(得分:0)

如果只想支持一个动作,似乎没有任何理由使用ViewSet。相反,请使用指向特定网址的CreateApiView

答案 1 :(得分:0)

使用 5 7 属性

http_method_names

答案 2 :(得分:0)

如果viewset没有任何详细信息方法,则drf SimpleRouter将不会为/api/basename/{id}/

创建任何url路由。

因此Django的url调度程序将根本不匹配这些url,并返回404。

我认为对于每种方法都返回405是没有道理的。该状态表示至少有一种方法对于特定的URL应该有效。

您可以添加一个虚拟详细信息方法,但只需将所有请求移交给APIView 405处理程序即可。

我认为这应该强制路由器为视图集注册详细网址,并为所有内容返回405(可能是OPTIONS例外)。

class MyViewSet(mixins.CreateModelMixin, viewsets.GenericViewSet):

    def retrieve(self, request, *args, **kwargs):
        return self.http_method_not_allowed(request, *args, **kwargs)