3

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

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

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

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

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

4

2 回答 2

14

有点晚了,但也许这会对某人有所帮助。

我的解决方案是覆盖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
        )
于 2013-06-14T15:24:18.727 回答
1

由于您似乎已经为用户授权,您应该能够通过添加到 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 
于 2012-12-04T14:18:51.197 回答