【问题标题】:django-rest-framework limit the allowed_methods to GETdjango-rest-framework 将 allowed_methods 限制为 GET
【发布时间】:2012-03-21 22:25:30
【问题描述】:

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

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

allowed_methods = ('GET',)

【问题讨论】:

    标签: django rest django-rest-framework


    【解决方案1】:

    如果你正在使用 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是不允许的。

    【讨论】:

    • 我喜欢这种方法,它似乎更简单,但您必须为每个视图集重复自己。也许有另一种方法可以同时对所有视图集执行此操作。你知道怎么做吗?
    • 我同意。例如,我曾期望像 AllowAllMethods 这样的常量等同于 AllowAny 权限。
    • @ePascoal 您可以创建一个 Viewset 类,该类继承自您希望允许的 http 方法的 mixin:django-rest-framework.org/api-guide/viewsets/…
    【解决方案2】:

    抱歉,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")
    

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        【解决方案4】:

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

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

        如果您想要一个仅提供 list 和 retrieve 方法的视图集(它们都使用 GET),那么请执行以下操作:

        class ListRetrieveViewSet(
              Viewsets.GenericViewSet,
              mixins.ListModelMixin,  
              mixins.RetrieveModelMixin,
        )
                                        
        

        【讨论】:

          【解决方案5】:

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

          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/
          

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

          【讨论】:

          • 好的,这对于更复杂的新视图很有用,我一直在寻找的答案,我自己发现了。
          • 啊,我错过了rest.ep.io,这是一个非常有用的链接! (对不起,我猜是为了很多深夜工作)
          • 顺便说一句,我原来的问题的答案在我自己添加的答案中,但是,这是有用的,不接受作为答案,所以谢谢!
          • 好!我也一直在摆弄这个。我也来自具有 allowed_methods 的同一个休息框架(不记得名字)。我对 django-rest-framework 非常满意。祝你好运:)
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2016-04-04
          • 2016-07-08
          • 1970-01-01
          • 1970-01-01
          • 2020-10-28
          • 1970-01-01
          • 2021-06-19
          相关资源
          最近更新 更多