2012-09-18 54 views
12

Tastypie APIKey認證如何工作?我知道有一個信號在文檔中提到:Tastypie APIKey認證

from django.contrib.auth.models import User  
from django.db import models 
from tastypie.models import create_api_key 

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

但是,這是什麼時候調用的?如果我想給用戶他們的APIkey,我知道我可以在APIKey數據庫中找到這個create_api_key函數添加密鑰的功能,但是在哪裏以及何時調用models.signals.post_save函數?

這只是另一個Django模型?我覺得是這樣的?

每次保存用戶帳號時都會調用它嗎?

回答

18

你可以把它放在相關應用程序的models.py文件中(如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()將創建一個新的ApiKey記錄,這將關係到呼叫User。當該記錄保存到ApiKey表格時,該記錄也將具有HMAC密鑰。該鍵是由generate_key()函數生成的。

+0

真棒完美...謝謝。因此,如果我更改用戶的帳戶信息,那麼api密鑰也會更改(比如密碼更改)? –

+1

不,只有在創建新用戶記錄時纔會創建API密鑰:https://docs.djangoproject.com/en/dev/ref/signals/#post-save。基本上,當創建新的'User'記錄時,'created = True'參數將被髮送到'create_api_key()',更新'User'不會設置'created = True',因此不會觸發ApiKey的創建。 –

+0

謝謝。有用的信息 –