2012-09-18 13 views
12

Come funziona l'autenticazione APIKey Tastypie? So che c'è un segnale come menzionato nella documentazione:Autenticazione APIKey Tastypie

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) 

Tuttavia, quando viene chiamato? Se voglio dare a un utente la sua APIkey, so che posso trovarla nel APKey db che questa funzione di create_api_key aggiunge la chiave, ma dove e quando chiamo questa funzione models.signals.post_save?

È solo un altro modello di django? Io penso che sia?

Viene chiamato ogni volta che viene salvato un account utente?

risposta

18

È possibile inserire questo nel file models.py dell'app pertinente (ad esempio main/). Quello che fa post_save.connect(create_api_key, sender=User) è che ogni volta che viene salvata un'istanza User, verrà chiamato create_api_key().

Ora diamo un'occhiata in quello che create_api_key() fa tuffandosi un po 'nella fonte di tastypie:

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

Come si può vedere, create_api_key() creerà un nuovo ApiKey record, che sarà legato alla chiamando User. Questo record avrà anche una chiave HMAC quando è stato salvato nella tabella ApiKey. La chiave è generata dalla funzione generate_key().

+0

fantastico perfetto ... grazie. Quindi, se cambio le informazioni sull'account di un utente, cambierà anche la chiave api (ad esempio la password è cambiata)? –

+1

No, la chiave API verrà creata solo quando viene creato un nuovo record utente: https://docs.djangoproject.com/en/dev/ref/signals/#post-save. Fondamentalmente, quando viene creato un nuovo record 'User', un parametro' created = True' verrà inviato a 'create_api_key()', l'aggiornamento di 'User' non imposterà' created = True', quindi non innescherà la creazione di ApiKey. –

+0

Grazie. Buono a sapersi –