我刚刚开始使用 django-rest-framework。对此非常热情,除了可用的例子很少。让 api 工作进展顺利,但所有额外的工作都是一个难题。(添加额外的自定义字段等)
现在我想知道如何在 ListView 或 DetailView 中限制 allowed_methods。将此添加到views.py中的类中,就像我在某处读到的答案一样...似乎没有任何效果:
allowed_methods = ('GET',)
我刚刚开始使用 django-rest-framework。对此非常热情,除了可用的例子很少。让 api 工作进展顺利,但所有额外的工作都是一个难题。(添加额外的自定义字段等)
现在我想知道如何在 ListView 或 DetailView 中限制 allowed_methods。将此添加到views.py中的类中,就像我在某处读到的答案一样...似乎没有任何效果:
allowed_methods = ('GET',)
如果您正在使用 ModelViewSet 并且仍想限制某些方法,您可以添加http_method_names
.
例子:
class SomeModelViewSet(viewsets.ModelViewSet):
queryset = SomeModel.objects.all()
serializer_class = SomeModelSerializer
http_method_names = ['get', 'post', 'head']
一旦你这样做get
,post
和head
将被允许。但是put
,patch
并且delete
不会被允许。
抱歉,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")
就像 django-rest-framework 中的几乎所有东西一样,一旦你发现它,它就非常简单。在 URL 中,我不得不使用 ListModelView 而不是使用 ListOrCreateModelView。
除了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,
)
根据近年来的反对票,可能不再相关了。它在 '12 tho 中是相关的 :)
Django-rest-framework 其实有很多例子..
查看http://django-rest-framework.org、http://django-rest-framework.org/contents.html和http://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'),
)