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