15

我刚刚开始使用 django-rest-framework。对此非常热情,除了可用的例子很少。让 api 工作进展顺利,但所有额外的工作都是一个难题。(添加额外的自定义字段等)

现在我想知道如何在 ListView 或 DetailView 中限制 allowed_methods。将此添加到views.py中的类中,就像我在某处读到的答案一样...似乎没有任何效果:

allowed_methods = ('GET',)
4

5 回答 5

100

如果您正在使用 ModelViewSet 并且仍想限制某些方法,您可以添加http_method_names.

例子:

class SomeModelViewSet(viewsets.ModelViewSet):
    queryset = SomeModel.objects.all()
    serializer_class = SomeModelSerializer
    http_method_names = ['get', 'post', 'head']

一旦你这样做getposthead将被允许。但是putpatch并且delete不会被允许。

于 2015-07-16T10:00:57.050 回答
4

抱歉,necro,但我偶然发现了这个问题,正在寻找类似的问题。

我只想允许retrieve()但不允许list()。我最终做了什么:

from rest_framework import viewsets
from rest_framework.exceptions import MethodNotAllowed

from myapp.models import MyModel

class MyViewSet(viewsets.ModelViewSet):
    http_method_names = ["get"]
    queryset = MyModel.objects.all()
    serializer_class = MySerializer

    def list(self, request, *args, **kwargs):
        raise MethodNotAllowed("GET")
于 2018-08-08T08:28:59.637 回答
2

就像 django-rest-framework 中的几乎所有东西一样,一旦你发现它,它就非常简单。在 URL 中,我不得不使用 ListModelView 而不是使用 ListOrCreateModelView。

于 2012-03-03T21:20:30.543 回答
2

除了http_method_names之外,这里还有 Django Rest Framework 提出的解决方案:https ://www.django-rest-framework.org/api-guide/viewsets/#custom-viewset-base-classes

它包括从GenericViewSet而不是ModelViewSet以及从适当的 mixin 类继承。

如果您想要一个仅提供列表检索方法的视图集(它们都使用GET),请执行以下操作:

class ListRetrieveViewSet(
      Viewsets.GenericViewSet,
      mixins.ListModelMixin,  
      mixins.RetrieveModelMixin,
)
                                
于 2021-01-17T04:52:45.640 回答
0

根据近年来的反对票,可能不再相关了。它在 '12 tho 中是相关的 :)

Django-rest-framework 其实有很多例子..

查看http://django-rest-framework.orghttp://django-rest-framework.org/contents.htmlhttp://rest.ep.io/以获得一些好的示例和文档。

如果您自己设计一个 REST 函数,而不是使用任何 django-rest-framework 魔法(如 rest.ep.io)为您生成它,您应该查看 mixin(http://django-rest-framework .org/howto/mixin.html)。

如果您想限制为仅获取方法。只需使用 def get(...) 和 mixin 类。

提供的链接示例:

curl -X GET http://rest.ep.io/mixin/

网址.py

from djangorestframework.compat import View
from djangorestframework.mixins import ResponseMixin
from djangorestframework.renderers import DEFAULT_RENDERERS
from djangorestframework.response import Response

from django.conf.urls.defaults import patterns, url
from django.core.urlresolvers import reverse


class ExampleView(ResponseMixin, View):
    renderers = DEFAULT_RENDERERS

    def get(self, request):
        response = Response(200, {'description': 'Some example content',
                                  'url': reverse('mixin-view')})
        return self.render(response)


urlpatterns = patterns('',
    url(r'^$', ExampleView.as_view(), name='mixin-view'),
)
于 2012-03-03T21:19:55.570 回答