Tastypie有一个生成API密钥的辅助函数吗?

10

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

我知道每次调用ApiKey.objects.create()都会为未生成密钥的用户生成一个API密钥。但是,如果用户已经有一个密钥,则尝试调用.create()方法会引发错误。

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

是否有人知道任何这样的助手函数?

5个回答

7
或者,你可以直接使用tastypie的内置命令:
python manage.py backfill_api_keys

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)

我会将 api_key.key = None; api_key.save() 移出 try 块,可能移到 else 块中,以尽可能准确地说明你的意图。 - Jamey

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

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

7
小心操作。你的代码无法工作,因为调用get_or_create方法会返回一个元组,其中包括创建的ApiKey对象和一个布尔值,而不是一个ApiKey对象。根据你的第一句话生成了密钥,所以你不需要再次调用generate_key()方法。你可以通过输入api_key[0].key来查看由第一句话生成的密钥。 - José L. Patiño

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()

0

总是使用内置函数太容易了。在 Tastypie 中生成 Api 密钥,请使用 TastypiesApikeyAuthentication` 的 "create_api_key"。

您只需从 tastypie.models 导入 "create_api_key",然后通过 django-signal 或根据需要调用它。

例如:

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

详细解释并更易理解,请访问:

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接