我想做的是每当用户请求API密钥时,无论该用户是否已经生成过密钥,系统都会生成一个全新的密钥。
我知道每次调用ApiKey.objects.create()
都会为未生成密钥的用户生成一个API密钥。但是,如果用户已经有一个密钥,则尝试调用.create()
方法会引发错误。
在这种情况下,我认为最好编写自己的密钥生成器。但是,我希望这里的某个人可能知道一个助手函数,它将允许我生成随机API密钥,然后让我自己手动保存到数据库中。
是否有人知道任何这样的助手函数?
python manage.py backfill_api_keys
我搞明白了。
首先,您尝试获取用户的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)
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
get_or_create
方法会返回一个元组,其中包括创建的ApiKey
对象和一个布尔值,而不是一个ApiKey
对象。根据你的第一句话生成了密钥,所以你不需要再次调用generate_key()
方法。你可以通过输入api_key[0].key
来查看由第一句话生成的密钥。 - José L. Patiño根据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()
总是使用内置函数太容易了。在 Tastypie
中生成 Api 密钥,请使用 Tastypies
ApikeyAuthentication` 的 "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
api_key.key = None; api_key.save()
移出 try 块,可能移到 else 块中,以尽可能准确地说明你的意图。 - Jamey