django-rest-framework将allowed_methods限制为GET

mic*_*mit 10 django rest django-rest-framework

我刚刚开始使用django-rest-framework.除了可用的例子很少之外,它非常热衷于此.让api工作变得很好,但所有额外的东西都是一个难题.(添加额外的自定义字段等)

现在我想知道如何限制allowed_methods,例如ListView或DetailView.将它添加到views.py中的类,就像我读到某处作为答案...似乎没有任何影响:

allowed_methods = ('GET',)
Run Code Online (Sandbox Code Playgroud)

Aks*_*aaj 68

如果您使用的是ModelViewSet,但仍想限制一些可以添加的方法http_method_names.

例:

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

一旦你这样做,get,posthead将被允许.但是put,patch并且delete不会被允许.


kun*_*mbi 5

抱歉死灵,但我偶然发现这个问题寻找类似的问题。

我只想允许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")
Run Code Online (Sandbox Code Playgroud)


xeo*_*eor 1

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

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/
Run Code Online (Sandbox Code Playgroud)

urls.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'),
)
Run Code Online (Sandbox Code Playgroud)