如何更改 django-rest-framework 的 authtoken 中的现有令牌?

Posted

技术标签:

【中文标题】如何更改 django-rest-framework 的 authtoken 中的现有令牌?【英文标题】:How can I change existing token in the authtoken of django-rest-framework? 【发布时间】:2014-01-08 03:31:50 【问题描述】:

保存失败:

from rest_framework.authtoken.models import Token

token = Token.objects.get(user=user1)
token.key = '1'
token.save()

给予

IntegrityError:重复键值违反唯一约束 "authtoken_token_user_id_key"

【问题讨论】:

请给我们看一下token表的内容,让我们知道重复数据的原因.. 现在只有一个token >>> Token.objects.all() >>> [] 【参考方案1】:

此示例代码适用于我并更新数据库中的令牌:

t = Token.objects.filter(user=user1)
new_key = t[0].generate_key()
t.update(key=new_key)

【讨论】:

【参考方案2】:

我今天遇到了同样的问题,所以我想我应该留下回复以供将来参考,解释为什么会发生这种情况。

keyToken 表的主键。

如果您编辑模型实例,当您调用save() 时,django 必须确定它是否必须执行INSERTUPDATE。它通过在数据库中查找现有行(使用主键)来做到这一点,因为您只是更改了主键,它不会找到它并假设它必须插入一个新行。由于您已经有该用户的一行并且 user_id 列具有唯一约束,因此插入将失败。

对应生成的sql的例子。

>>> t = Token.objects.get(user=User.objects.get(id=1))
>>> t.key
u'b0750c801a1b075051ed084841f3001bb55dd1f1'
>>> t.key = t.generate_key()
'cafb2efb9b26912d60fc5a0a75b2b7ba0348a2ec'
t.save()

save() 调用呈现

SELECT (1) AS "a"
  FROM "authtoken_token"
  WHERE "authtoken_token"."key" = 'cafb2efb9b26912d60fc5a0a75b2b7ba0348a2ec'
  LIMIT 1;
INSERT
  INTO "authtoken_token" ("key", "user_id", "created")
  VALUES ('cafb2efb9b26912d60fc5a0a75b2b7ba0348a2ec', 1, '2014-03-18 21:48:30.434677+00:00');

很明显,SELECT 正在寻找带有已编辑令牌 (cafb2efb9b26912d60fc5a0a75b2b7ba0348a2ec) 的行。

解决方案

我想在这种特定情况下,您可以删除旧的 Token 实例并创建一个新实例(在单个事务中),它会自动为您生成密钥,例如:

token.delete()
Token.objects.create(user=user1)

请注意,这是 ORM 级别的问题,您可以避免删除/插入,只需更改该行的值,但不要在 save() 方法上使用。

使用 update() 方法是一个不错的选择,正如 mariodev 建议的那样,您需要手动生成令牌(上面我是如何做到的),是的,它会更改主键,键列,但那是你一开始想要什么:)

【讨论】:

【参考方案3】:

好像这样可行:

Token.objects.filter(user=user1).update(key='1')

【讨论】:

谢谢。是的,它有效,但它改变了主键。我认为这不是一个好主意。所以我创建了自己的 Token 模型并添加了新的身份验证。 @nmb.ten 我迷路了,你到底需要改变什么?

以上是关于如何更改 django-rest-framework 的 authtoken 中的现有令牌?的主要内容,如果未能解决你的问题,请参考以下文章

文本标注系统

为啥 django-rest-framework 不显示 OneToOneField 数据 - django

尽管有 AllowAny 权限,django-rest-framework 在 POST、PUT、DELETE 上返回 403 响应

如何更改主题更改时浮动操作按钮的颜色?

Ubuntu系统如何更改用户密码

更改模式时如何更改导航阴影颜色?