2012-09-18 13 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 डीबी में पा सकता हूं कि यह create_api_key फ़ंक्शन कुंजी जोड़ता है, लेकिन मैं कहां और कब यह मॉडल.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 से संबंधित हो जाएगा पैदा करेगा। इस रिकॉर्ड में HMAC कुंजी भी होगी जब इसे ApiKey तालिका में सहेजा गया था। कुंजी generate_key() फ़ंक्शन द्वारा उत्पन्न होती है।

+0

भयानक सही ... धन्यवाद। तो अगर मैं उपयोगकर्ता की खाता जानकारी बदलता हूं तो एपीआई कुंजी भी बदल जाएगा (पासवर्ड कहां बदल गया है)? –

+1

नहीं, एपीआई कुंजी केवल तब बनाई जाएगी जब कोई नया उपयोगकर्ता रिकॉर्ड 'बनाया गया' है: https://docs.djangoproject.com/en/dev/ref/signals/#post-save। असल में, जब नया 'उपयोगकर्ता' रिकॉर्ड बनाया जाता है, तो 'create = True' पैरामीटर' create_api_key() 'पर भेजा जाएगा,' उपयोगकर्ता 'को अपडेट नहीं किया जाएगा' बनाया गया 'सही' इस प्रकार अपीकी निर्माण को ट्रिगर नहीं करेगा। –

+0

धन्यवाद। जानना अच्छा है –

संबंधित मुद्दे