【问题标题】:Restricting Django-Rest-Framework default CRUD operations to only GET and restricting POST, PUT and DELETE将 Django-Rest-Framework 默认 CRUD 操作限制为仅 GET 并限制 POST、PUT 和 DELETE
【发布时间】:2012-03-08 01:30:29
【问题描述】:

我正在使用 Django-Rest-Framework。在按照教程进行操作时,我能够通过定义 ModelResource 来制作 CRUD API。现在,我想通过为 GET 提供 API 来限制访问,而不为 POST、PUT 或 DELETE 提供访问。 我试过了

allowed_methods = ('GET')

但这并没有做任何事情。另外,我尝试覆盖 ModelResource 的删除功能,但它也没有做任何事情,删除仍然有效。

似乎是直截了当的事情,但即使花了几个小时我也无法弄清楚。

【问题讨论】:

  • 能否提供更多源代码?喜欢你的类声明和/或你的 url 模式?

标签: django api rest http-post


【解决方案1】:

刚看到这个。您的代码中有一个小错误。而不是:

 allowed_methods = ('GET')

allowed_methods = ('GET',)

注意后面的逗号,这是为了让 python 将其视为一个包含一个字符串的列表,而不是一个包含三个字符的列表。由于 python 将字符串视为字符列表,因此第一行的计算结果为列表 ('G','E','T'),并且您的类中没有这些方法可用。

【讨论】:

    【解决方案2】:

    你需要做这样的事情:

    from djangorestframework.mixins import ReadModelMixin, UpdateModelMixin
    from djangorestframework.views import ModelView
    from djangorestframework.response import Response
    
    from resources import MyResource
    
    class MyResourceInstanceView(ReadModelMixin, ModelView):
      resource = MyResource
    

    这基本上取代了InstanceModelView 的使用,它还实现了PutUpdateDelete 混合。

    【讨论】:

      【解决方案3】:

      也许你正在使用这样的东西:

      resources.py

      from djangorestframework.resources import ModelResource
      
      from .models import Menu
      
      
      class MenuResource(ModelResource):
          model = MenuOfTheDay
          allowed_methods = ('GET', )
      

      urls.py

      from djangorestframework.views import ListOrCreateModelView, InstanceModelView
      
      from .resources import MenuResource
      
      
      urlpatterns += patterns('',
          url(r'^api/menu/$', ListOrCreateModelView.as_view(resource=MenuResource), name='menu-resource-root'),
          url(r'^api/menu/(?P<pk>[0-9]+)/$', InstanceModelView.as_view(resource=MenuResource)),
      )
      

      allowed_methods 如果在 Resource 子类中将没有用,它应该在 View 子类中,如 ListModelView 类,所以如果你改变你的 urls.py用这个:

      from djangorestframework.views import ListModelView, InstanceModelView
      
      from .resources import MenuResource
      
      
      urlpatterns += patterns('',
          url(r'^api/menu/$', ListModelView.as_view(resource=MenuResource), name='menu-resource-root'),
          url(r'^api/menu/(?P<pk>[0-9]+)/$', InstanceModelView.as_view(resource=MenuResource)),
      )
      

      它会正常工作:)

      【讨论】:

        猜你喜欢
        • 2012-03-21
        • 2015-12-15
        • 1970-01-01
        • 2015-01-25
        • 1970-01-01
        • 2023-03-09
        • 2016-04-04
        • 2018-09-17
        • 1970-01-01
        相关资源
        最近更新 更多