django-rest-framework ограничивает разрешенные методы для получения

Я только что начал с django-rest-framework. Довольно восторженно об этом, за исключением того, что существует очень мало примеров. получение работы api идет отлично, но все дополнительные-это головоломка. (добавление дополнительных настраиваемых полей и т. д.)

теперь мне интересно, как вы можете ограничить allowed_methods, например, в ListView или DetailView. Добавление этого в класс в views.py как будто я где-то читал ответ... не похоже, что есть какие-либо эффект:

allowed_methods = ('GET',)

4 ответов


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).

Если вы хотите ограничить только методы get. Просто используйте def get(...) и класс mixin.

пример из ссылки:

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

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'),
)

если вы используете ModelViewSet и все еще хотите ограничить некоторые методы, вы можете добавить http_method_names.

пример:

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

после этого get, post и head будет разрешено. Но!--5-->, patch и delete не будут допущены.


как почти все в django-rest-framework, как только вы это узнаете, это очень просто. В URL-адресах вместо использования ListOrCreateModelView мне пришлось использовать ListModelView.


извините за некро, но я наткнулся на этот вопрос ищут подобный вопрос.

Я только хотел, чтобы 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")