【问题标题】:Does Tastypie have a helper function to generate API keys?Tastypie 有生成 API 密钥的辅助函数吗?
【发布时间】:2012-06-12 01:10:21
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: django tastypie


    【解决方案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()
    

    【讨论】:

      【解决方案2】:

      它总是太容易使用内置函数。要在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

      【讨论】:

        【解决方案3】:

        是的,生成密钥的代码定义为实例方法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 来查看第一句生成的密钥。
        【解决方案4】:

        或者,你也可以直接使用 sweetpie 的内置命令:

        python manage.py backfill_api_keys
        

        【讨论】:

          【解决方案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)
          

          【讨论】:

          • 我会将 api_key.key = None; api_key.save() 从 try 块中移出,可能会移到 else 块中,以尽可能准确地说明您正在尝试的内容。
          猜你喜欢
          • 1970-01-01
          • 2013-05-29
          • 1970-01-01
          • 2012-04-29
          • 2012-10-01
          • 2010-11-29
          • 1970-01-01
          • 1970-01-01
          • 2010-10-28
          相关资源
          最近更新 更多