tastypie - 在哪里限制可能由PATCH更新的字段?

时间:2012-12-04 13:44:18

标签: python django patch tastypie

我有一个有效的GET / tastypie(只读)解决方案。

我已经允许PUT / PATCH请求并成功修补记录。

但是,我想将PATCH功能仅限于适当的模型资源上的某些字段,用于(已经)经过身份验证和授权的用户。我仍然希望用户能够获取(参见)所有字段。

实现这种限制的最佳位置(方法?)在哪里?

文档: https://django-tastypie.readthedocs.org/en/latest/interacting.html?highlight=patch#partially-updating-an-existing-resource-patch

2 个答案:

答案 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