Tastypie是否有辅助函数来生成API密钥?

Sal*_*Sal 10 django tastypie

我想要做的是每当用户请求API密钥时 - 无论用户是否已生成一个 - 系统将生成一个全新的密钥.

我知道每当调用时ApiKey.objects.create()都会为没有生成的用户生成一个API密钥.但是,如果用户确实有一个,则尝试调用该.create()方法会引发错误.

在这种情况下,我认为最好编写自己的密钥生成器.但是,我现在希望这里的某个人可能知道一个帮助函数,它允许我生成一个随机的API密钥,然后让我自己手动将它保存到数据库中.

有人可能知道任何这样的帮手功能吗?

Eri*_*rik 7

或者,您可以使用tastypie的内置命令:

python manage.py backfill_api_keys
Run Code Online (Sandbox Code Playgroud)


Sal*_*Sal 6

我想到了.

首先,您尝试获取用户的API密钥.如果存在,则不会抛出任何错误.要重新生成,请将检索到的用户密钥的值设置为None,然后保存密钥.

如果抛出错误,则只需创建一个新密钥.

try:
    api_key = ApiKey.objects.get(user=someuser)
    api_key.key = None
    api_key.save()

except ApiKey.DoesNotExist:
    api_key = ApiKey.objects.create(user=someuser)
Run Code Online (Sandbox Code Playgroud)


Fil*_*vić 5

是的,生成密钥的代码被定义为ApiKey.generate_key()可以直接使用的实例方法.

这是一个更简单的版本,它可以消除用户是否已经存在的猜测,ApiKey.generate_key()直接使用,而不是隐式使用ApiKey.save(),我相信这样可以更清楚地了解用户所做的事情:

api_key = ApiKey.objects.get_or_create(user=someuser)
api_key.key = api_key.generate_key()
api_key.save()
Run Code Online (Sandbox Code Playgroud)

更新:

因此,最短的版本是:

return ApiKey.objects.get_or_create(user=someuser)[0].key
Run Code Online (Sandbox Code Playgroud)

这将生成新密钥或返回现有密钥.

  • 小心一点.你的代码不起作用,因为调用`get_or_create`会返回一个由`ApiKey`创建的对象和一个布尔值组成的元组,而不是一个'ApiKey`对象.使用您的第一个句子创建密钥,因此您不需要再次调用`generate_key()`方法.您可以通过键入以下内容来查看第一句生成的密钥:`api_key [0] .key`. (7认同)