我正在使用Django-Rest-Framework。在遵循本教程的同时,我通过定义ModelResource来创建CRUD API。现在,我想通过提供仅用于GET的API来限制访问,而不是为POST,PUT或DELETE提供访问权限。 我试过了
allowed_methods = ('GET')
但这没有任何作用。此外,我试图覆盖ModelResource的删除功能,但它也没有做任何事情,删除仍然有效。
似乎是直截了当的事情,但即使花了几个小时,我也无法弄明白。
答案 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
也实现了Update
,Delete
和{{1}}混合。