2012-09-18 2 views
12

Tastypie APIKey 인증은 어떻게 작동합니까? 설명서에 언급 된 신호가 있다는 것을 알고 있습니다.Tastypie APIKey 인증

그러나 이것이 언제 호출됩니까? 사용자에게 API 키를주고 싶다면이 create_api_key 함수가 키를 추가하는 APIKey db에서 찾을 수 있지만 어디에서 언제이 models.signals.post_save 함수를 호출 할 수 있습니까?

이것은 또 다른 장고 모델입니까? 나는 그것이라고 생각 하느냐?

사용자 계정이 저장 될 때마다 이것을 호출합니까?

답변

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()이 (가) 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

감사합니다. 알아두면 좋은 점 –