2012-09-18 8 views
12

Tastypie APIKey認証はどのように機能しますか?私は文書に記載されているような信号があることを知っています:Tastypie APIKey認証

しかし、これはいつですか?ユーザーにAPIキーを渡したいのであれば、このcreate_api_key関数がキーを追加するAPIKey db内で見つけることができますが、このmodels.signals.post_save関数をいつ呼び出すのですか?

これはちょうど別のジャンゴモデルですか?それはそうですね?

これは、ユーザーアカウントが保存されるたびに呼び出されますか?

答えて

18

これはの関連アプリのファイル(main/など)に入れることができます。 post_save.connect(create_api_key, sender=User)は、Userインスタンスが保存されるたびにcreate_api_key()が呼び出されることを意味します。

今度は、ビットtastypieのソースにダイビングで何をするかcreate_api_key()に見てみましょう:あなたが見ることができるように

class ApiKey(models.Model): 
    user = models.OneToOneField(User, related_name='api_key') 
    key = models.CharField(max_length=256, blank=True, default='') 
    created = models.DateTimeField(default=datetime.datetime.now) 

    def __unicode__(self): 
     return u"%s for %s" % (self.key, self.user) 

    def save(self, *args, **kwargs): 
     if not self.key: 
      self.key = self.generate_key() 

     return super(ApiKey, self).save(*args, **kwargs) 

    def generate_key(self): 
     # Get a random UUID. 
     new_uuid = uuid.uuid4() 
     # Hmac that beast. 
     return hmac.new(str(new_uuid), digestmod=sha1).hexdigest() 


def create_api_key(sender, **kwargs): 
    """ 
    A signal for hooking up automatic ``ApiKey`` creation. 
    """ 
    if kwargs.get('created') is True: 
     ApiKey.objects.create(user=kwargs.get('instance')) 

create_api_key()は呼び出しUserに関連される新しいApiKeyレコードを作成します。このレコードは、ApiKeyテーブルに保存されたときにHMACキーも持ちます。キーはgenerate_key()機能によって生成されます。

+0

すごく完璧です...ありがとう。だから私はユーザーのアカウント情報を変更する場合は、同様に(パスワードが変更されたと言う)APIのキーの変更ですか? –

+1

いいえ、APIキーは、新しいユーザーレコードが 'created'の場合にのみ作成されます:https://docs.djangoproject.com/en/dev/ref/signals/#post-save。基本的に新しい 'User'レコードが作成されると' created = True'パラメータが 'create_api_key()'に送られ、 'User'は' created = True'に設定されず、ApiKeyの作成は行われません。 –

+0

ありがとうございます。知っておくべきこと –