我有一个有效的 GET /tastepie(只读)解决方案。
我已允许 PUT/PATCH 请求并成功修补记录。
但是,对于(已经)经过身份验证和授权的用户,我想将 PATCH 功能限制为仅在适当的模型资源上的某些字段。我仍然希望用户能够获取(查看)所有字段。
实现这种限制的最佳位置(方法?)在哪里?
我有一个有效的 GET /tastepie(只读)解决方案。
我已允许 PUT/PATCH 请求并成功修补记录。
但是,对于(已经)经过身份验证和授权的用户,我想将 PATCH 功能限制为仅在适当的模型资源上的某些字段。我仍然希望用户能够获取(查看)所有字段。
实现这种限制的最佳位置(方法?)在哪里?
有点晚了,但也许这会对某人有所帮助。
我的解决方案是覆盖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
)
由于您似乎已经为用户授权,您应该能够通过添加到 ModelResource 中的 Meta 类来实现这一点。例如,使用 DjangoAuthorization (来自tastepie 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
。
我也从美味的谷歌集团那里得到了这个。它采用脱水法。以下是 Google Groups 链接中提供的示例:
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