我有一个有效的GET / tastypie(只读)解决方案。
我已经允许PUT / PATCH请求并成功修补记录。
但是,我想将PATCH功能仅限于适当的模型资源上的某些字段,用于(已经)经过身份验证和授权的用户。我仍然希望用户能够获取(参见)所有字段。
实现这种限制的最佳位置(方法?)在哪里?
答案 0 :(得分:13)
有点晚了但也许这会对某人有所帮助。
我的解决方案是覆盖update_in_place
并检查传递的数据。
from tastypie.resources import ModelResource
from tastypie.exceptions import BadRequest
class MyResource(ModelResource):
class Meta:
...
allowed_update_fields = ['field1', 'field2']
def update_in_place(self, request, original_bundle, new_data):
if set(new_data.keys()) - set(self._meta.allowed_update_fields):
raise BadRequest(
'Only update on %s allowed' % ', '.join(
self._meta.allowed_update_fields
)
)
return super(MyResource, self).update_in_place(
request, original_bundle, new_data
)
答案 1 :(得分:1)
由于您似乎已经对用户进行了授权,因此您应该能够通过添加到ModelResource中的Meta类来实现此功能。例如,使用DjangoAuthorization(from tastypie docs):
from tastypie.authentication import BasicAuthentication
from tastypie.authorization import DjangoAuthorization
...
class SomeResource(ModelResource):
...
class Meta:
...
authentication = BasicAuthentication()
authorization = DjangoAuthorization()
此示例将为您提供django.contrib.auth.models.Permission
中定义的操作的用户授权。
我还有来自tastypie Google Group的this。它使用dehydrate method。以下是Google网上论坛链接中提供的示例:
def dehydrate(self, bundle):
bundle = super(self, MyResource).dehydrate(bundle)
# exclude the restricted field for users w/o the permission foo
if not bundle.request.user.has_perm('app.foo'):
del bundle.data['restricted']
return bundle