10

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

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

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

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

4

5 回答 5

7

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

python manage.py backfill_api_keys
于 2013-12-15T21:11:58.517 回答
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)
于 2012-06-07T23:27:27.450 回答
5

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

这是一个更简单的版本,它消除了用户是否已经存在的一些猜测并ApiKey.generate_key()直接使用,而不是隐式 through 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

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

于 2012-06-07T23:38:07.553 回答
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()
于 2020-12-28T07:51:41.353 回答
0

它总是太容易使用内置功能。Tastypie使用create_api_keyTastypie ApikeyAuthentication` 的 " "生成 Api 密钥s

您只需导入“ create_api_keytastypie.models ,然后按您的django-signal要求或按您的要求调用它。

IE

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

在以下位置进行了详细且更容易的解释:

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

于 2015-12-08T07:08:56.290 回答