2012-09-18 19 views
12

¿Cómo funciona la autenticación Tastypie APIKey? Sé que hay una señal como se menciona en la documentación:Autenticación 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) 

Sin embargo, ¿cuándo se llama? Si quiero darle a un usuario su APIkey, sé que puedo encontrarlo en APIKey db, que esta función create_api_key agrega la clave, pero ¿dónde y cuándo puedo llamar a esta función models.signals.post_save?

¿Es este otro modelo de django? ¿Creo que es?

¿Se invoca esto cada vez que se guarda una cuenta de usuario?

Respuesta

18

Puede poner esto en el archivo models.py de la aplicación correspondiente (como main/). Lo que post_save.connect(create_api_key, sender=User) hace es que cada vez que se guarde una instancia de User, se invocará create_api_key().

Ahora vamos a ver en lo que create_api_key() hace por medio de buceo un poco en la fuente de 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')) 

Como se puede ver, create_api_key() va a crear un nuevo registro de ApiKey, que se relaciona con la llamada User. Este registro también tendrá una clave HMAC cuando se guardó en la tabla ApiKey. La clave se genera mediante la función generate_key().

+0

increíble perfecto ... gracias. Entonces, si cambio la información de la cuenta de un usuario, la clave de la API también cambia (digamos que la contraseña ha cambiado). –

+1

No, la clave API solo se creará cuando se 'crea' un nuevo registro de usuario: https://docs.djangoproject.com/en/dev/ref/signals/#post-save. Básicamente, cuando se crea un nuevo registro 'User', se envía un parámetro' created = True' a 'create_api_key()', al actualizar 'User' no se establece' created = True', por lo que no se activará la creación de ApiKey. –

+0

Gracias. Es bueno saber –

Cuestiones relacionadas