将Django-Rest-Framework的默认CRUD操作限制为仅限GET并限制POST,PUT和DELETE

时间:2012-03-08 01:30:30

标签: django api rest http-post

我正在使用Django-Rest-Framework。在遵循本教程的同时,我通过定义ModelResource来创建CRUD API。现在,我想通过提供仅用于GET的API来限制访问,而不是为POST,PUT或DELETE提供访问权限。 我试过了

allowed_methods = ('GET')

但这没有任何作用。此外,我试图覆盖ModelResource的删除功能,但它也没有做任何事情,删除仍然有效。

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

3 个答案:

答案 0 :(得分:3)

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

 allowed_methods = ('GET')

allowed_methods = ('GET',)

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

答案 1 :(得分:1)

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

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)),
)
如果在Resource子类中,

allowed_methods 将无用,它应该在 ListModelView 类中的View子类中,因此如果您更改了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)),
)

它会正常工作:)

答案 2 :(得分:1)

你需要做这样的事情:

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的使用,Put也实现了UpdateDelete和{{1}}混合。