2012-09-18 35 views
12

Tastypie APIKey kimlik doğrulaması nasıl çalışır? Tastypie APIKey kimlik doğrulaması

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) 
Ancak bu

denir

: Ben belgelerinde belirtildiği gibi bir sinyal olduğunu biliyorum? Bir kullanıcıya kendi API anahtarını vermek istersem, bu create_api_key işlevinin anahtarı eklediği APIKey db'de bulabildiğimi biliyorum, ancak bu models.signals.post_save işlevi ne zaman ve ne zaman arayabilirim?

Bu başka bir django modeli mi? Sanirim oyle?

Bu, her kullanıcı hesabı kaydedildiğinde çağrılır mı?

cevap

18

İlgili uygulamanın (örneğin, main/) models.py dosyasına koyabilirsiniz. Ne post_save.connect(create_api_key, sender=User), User örneğinin kaydedildiği her zaman create_api_key() çağrılır.

Şimdi tastypie kaynağı haline create_api_key() dalarak ne biraz içine bakalım:

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')) 

Gördüğünüz gibi, create_api_key()User arayarak ile ilgili olacaktır yeni ApiKey kaydını oluşturacaktır. Bu kayıt, ApiKey tablosuna kaydedildiğinde HMAC anahtarına da sahip olacaktır. Anahtar, generate_key() işlevi tarafından oluşturulur.

+0

müthiş mükemmel ... teşekkürler. Yani, bir kullanıcının hesabını değiştirirsem, api anahtarı da değişecektir (şifre değiştirildi mi)? –

+1

Hayır, API anahtarı yalnızca yeni bir kullanıcı kaydı oluşturulduğunda oluşturulur: https://docs.djangoproject.com/en/dev/ref/signals/#post-save. Temel olarak, yeni 'User' kaydı oluşturulduğunda' create = True' parametresi 'create_api_key()' öğesine gönderilir, 'User' güncellenir' 'Create = True' ayarlanmaz, böylece ApiKey oluşturulmasını tetiklemez. –

+0

Teşekkürler. Bilinmesi gerekenler –