我想要做的是每当用户请求API密钥时 - 无论用户是否已生成一个 - 系统都会生成一个全新的密钥。
我知道每当调用ApiKey.objects.create()
时,都会为没有生成的用户生成API密钥。但是,如果用户 有一个,那么尝试调用.create()
方法会引发错误。
在这种情况下,我认为最好编写自己的密钥生成器。但是,我现在希望这里的某个人可能知道一个帮助函数,它允许我生成一个随机的API密钥,然后让我自己手动将它保存到数据库中。
有人可能知道任何这样的辅助函数吗?
答案 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