Tastypie授权不完全授权?

时间:2016-02-14 12:18:43

标签: python django tastypie

让我们说我们希望能够只更新阶段整数字段低于3的那些对象。(或者类似的例子,我们想要将对象的权限仅限制更新为Owner users = fields .foreignkey)。因此,第一个示例授权将如下所示:

class RecordAuthorization(Authorization):
    def update_detail(self, object_list, bundle):
        if bundle.obj.stage < 3:
            return True
        raise Unauthorized("You can't update this")

或第二个例子:

class RecordAuthorization(Authorization):
    def update_detail(self, object_list, bundle):
        if bundle.obj.user == bundle.request.user:
            return True
        raise Unauthorized("You can't update this")

实际上它们都不会起作用(我测试了第一个并且它不起作用)。 仔细观察tastypie文档时,他们会说:

  

object_list是正在处理的对象的集合   请求。

所以这意味着在object_list中,只有json对象重写为python的dicts列表?所以没有来自数据库的真实对象,因此这个过滤:

def update_list(self, object_list, bundle):
    return object_list.filter(stage__lt=3)

将无法按预期工作(仅允许对阶段低于3的对象进行更新)。并会做类似的事情 - &gt;如果json(通过API发送,而不是数据库中的对象)阶段低于3允许更新。所以实际上你可以将stage = 5(在数据库中)的对象更新为stage = 1! 我也得到了update_detail函数同样奇怪的结果。所以我怀疑bundle.obj也是对象,但已经有了“json-updated”属性。

为了让事情顺利,我需要这样做:?!

class RecordAuthorization(Authorization):
    def update_detail(self, object_list, bundle):
        if User.objects.get(pk=bundle.obj.user.pk) == bundle.request.user:
            return True
        raise Unauthorized("You can't update this")

1 个答案:

答案 0 :(得分:0)

对于update_listobject_list参数将是一个应该被过滤的查询集(或非Django ORM数据源的其他可迭代的)。

对于update_detail,您要检查bundle.obj的属性,这是Resource.Meta.object_class的一个实例,例如Django模型。如果您设置Resource.Meta.queryset,则会为您设置Resource.Meta.object_class

您的代码中存在缩进错误,您应该在方法级别而不是类级别提升未授权。如果修复无法解决问题,请发布您的资源。