【问题标题】:How to Update Password Using TastyPie PATCH如何使用 TastyPie PATCH 更新密码
【发布时间】:2012-05-10 08:51:44
【问题描述】:

我了解 TastyPie 的基础知识,但自定义 ModelResource 方法让我很困惑。我正在尝试进行 PATCH api 调用来更新用户的密码,并且数据没有通过 set_password() 方法运行,因此使用原始值而不是数据库中的 HASH 进行更新。这是我的模型资源:

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 方法运行密码。

【问题讨论】:

    标签: django tastypie


    【解决方案1】:

    您应该使用 hydrate 方法来处理这个 raw_password 到所有情况(POST、PUT、PATCH)的哈希转换。我个人定义了一个虚拟字段raw_password,以免引起命名空间冲突,因为 Tastypie 允许您从 GET 请求中返回 POST/PUT/PATCH 对象(除了是一个好习惯):

    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
    

    【讨论】:

    • @digivampire 谢谢。我觉得我正朝着正确的方向前进。一些后续问题:您能否详细说明“定义虚拟字段”,在哪里完成以及如何配置?另外,'username='dummy'' 的意义何在?另外,有没有办法调试 hydrate 方法来查看包中的内容?
    • 此时,bundle 仅包含原始序列化数据,Tastypie 将从这些数据中创建完整的模型对象。虚拟字段是指从序列化输入中读取的条目,但不是实际的 TastyPie 或 Django 的 ORM 字段。简单地用于计算密码散列并放置到位,就好像客户端确实知道散列并使用password=hash_of(raw_password) 在请求中提交它一样。我不确定在实例化 User 对象时是否必须指定用户名。原来你不必这样做,所以忽略它:)。
    • 您可以使用 django.contrib.auth.hashers.make_password 函数代替创建用户实例。
    • 非常感谢。在我的情况下,密码被散列为 hydra() 在创建新对象时被调用了 3 次。我也在我的博客上写过关于用户管理的文章 - psjinx.com/programming/2013/06/07/…
    猜你喜欢
    • 2019-09-08
    • 2020-10-25
    • 2015-06-23
    • 2013-04-05
    • 2013-11-28
    • 1970-01-01
    • 2015-08-12
    • 2021-08-25
    • 1970-01-01
    相关资源
    最近更新 更多