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

时间:2012-06-07 22:55:41

标签: django tastypie

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

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

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

有人可能知道任何这样的辅助函数吗?

5 个答案:

答案 0 :(得分:7)

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

python manage.py backfill_api_keys

答案 1 :(得分:5)

我明白了。

首先,您尝试获取用户的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)

答案 2 :(得分: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()

<强>更新

因此,最短的版本是:

return ApiKey.objects.get_or_create(user=someuser)[0].key

这将生成一个新密钥或返回一个现有密钥。

答案 3 :(得分:1)

根据 Filip Dupanović 的回答,我的工作代码是这样的:

user = get_user_model().objects.get(email="some@email.com")
api_key = ApiKey.objects.get_or_create(user=user)
api_key[0].key = api_key[0].generate_key()
api_key[0].save()

答案 4 :(得分:0)

总是很容易使用内置功能。要在Tastypie生成Api密钥,请使用&#34; create_api_key&#34; Tastypie s ApikeyAuthentication`。

你必须导入&#34; create_api_key&#34;来自tastypie.models 然后按django-signal或按照您的要求调用它。

signals.post_save.connect(create_api_key, sender=User)

详细解释:

http://django-tastypie.readthedocs.org/en/latest/authentication.html#apikeyauthentication