Django 如何使用TastyPie修补程序更新密码

Django 如何使用TastyPie修补程序更新密码,django,tastypie,Django,Tastypie,我了解TastyPie的基础知识,但是自定义ModelResource方法让我非常困惑。我试图进行修补程序api调用以更新用户的密码,但数据没有通过set\u password()方法运行,因此使用原始值而不是数据库中的哈希值进行更新。这是我的模型资源: class UserResource(ModelResource): class Meta: queryset = User.objects.all() resource_name = 'user'

我了解TastyPie的基础知识,但是自定义ModelResource方法让我非常困惑。我试图进行修补程序api调用以更新用户的密码,但数据没有通过
set\u password()
方法运行,因此使用原始值而不是数据库中的哈希值进行更新。这是我的模型资源:

class UserResource(ModelResource):
    class Meta:
        queryset = User.objects.all()
        resource_name = 'user'
        excludes = ['is_active', 'is_staff', 'is_superuser']
        authorization = Authorization() 
        detail_allowed_methods = ['get', 'post', 'put', 'delete', 'patch']
        filtering = {
             'username': ALL,
        }
        authentication = ApiKeyAuthentication()

我假设我需要在这里使用
obj_update
方法,但不确定如何格式化此方法,以便在用户表中更新实际对象之前,通过
set_password
方法运行密码

您应该使用Hyde方法处理此原始密码,以对所有情况(POST、PUT、PATCH)进行哈希转换。我个人定义了一个虚拟字段
raw_password
,这样就不会引起名称空间冲突,因为Tastypie允许您发布/放置/修补从GET请求接收到的对象(这是一个很好的做法):


您应该使用水合物方法来处理此原始密码,以便对所有情况(POST、PUT、PATCH)进行哈希转换。我个人定义了一个虚拟字段
raw_password
,这样就不会引起名称空间冲突,因为Tastypie允许您发布/放置/修补从GET请求接收到的对象(这是一个很好的做法):


@谢谢你的帮助。我觉得我在这里朝着正确的方向前进。几个后续问题:您能否详细说明“定义虚拟字段”,在哪里完成以及如何配置?另外,“username='dummy''的意义是什么?另外,是否有一种方法可以调试水合物方法以查看捆绑包中的内容?此时,捆绑包仅包含原始序列化数据,Tastypie将从中创建完整的模型对象。所谓虚拟字段,我指的是从序列化输入读取的条目,但不是实际的tastypi或Django的ORM字段。仅用于计算密码散列并将其放置到位,就好像客户端确实知道散列并在请求中使用
password=hash\u of(raw\u password)
提交它一样。我不确定在实例化用户对象时是否必须指定用户名。事实证明你不必这么做,所以忽略:)。你可以使用django.contrib.auth.hasher.make_password函数而不是创建用户实例。非常感谢。在我的例子中,密码被散列,因为在创建新对象时水合物()被调用了3次。我在我的博客上也写了关于使用tastypie进行用户管理的文章-@digivampire谢谢。我觉得我在这里朝着正确的方向前进。几个后续问题:您能否详细说明“定义虚拟字段”,在哪里完成以及如何配置?另外,“username='dummy''的意义是什么?另外,是否有一种方法可以调试水合物方法以查看捆绑包中的内容?此时,捆绑包仅包含原始序列化数据,Tastypie将从中创建完整的模型对象。所谓虚拟字段,我指的是从序列化输入读取的条目,但不是实际的tastypi或Django的ORM字段。仅用于计算密码散列并将其放置到位,就好像客户端确实知道散列并在请求中使用
password=hash\u of(raw\u password)
提交它一样。我不确定在实例化用户对象时是否必须指定用户名。事实证明你不必这么做,所以忽略:)。你可以使用django.contrib.auth.hasher.make_password函数而不是创建用户实例。非常感谢。在我的例子中,密码被散列,因为在创建新对象时水合物()被调用了3次。我在我的博客上也写了关于使用tastypie进行用户管理的文章-
def hydrate(self, bundle):
    if bundle.data.has_key('raw_password'):
        u = User(username='dummy')
        u.set_password(bundle.data['raw_password'])
        bundle.data['password'] = u.password
    return bundle