2012-09-18 37 views
12

Xác thực API Tastypie hoạt động như thế nào? Tôi biết có một tín hiệu được đề cập trong tài liệu:Xác thực API 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) 

Tuy nhiên, khi nào điều này được gọi? Nếu tôi muốn cung cấp cho người dùng APIkey của họ, tôi biết tôi có thể tìm thấy nó trong API APIKey rằng hàm create_api_key này thêm khóa vào, nhưng ở đâu và khi nào tôi gọi hàm models.signals.post_save này?

Đây có phải là một mô hình django khác không? Tôi nghĩ rằng nó là?

Điều này có được gọi là mọi tài khoản người dùng được lưu không?

Trả lời

18

Bạn có thể đặt mã này vào models.py tệp của ứng dụng có liên quan (chẳng hạn như main/). Điều gì post_save.connect(create_api_key, sender=User) là mỗi khi một cá thể User được lưu, create_api_key() sẽ được gọi.

Bây giờ chúng ta hãy nhìn vào những gì create_api_key() làm bằng lặn một chút vào nguồn gốc của 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')) 

Như bạn thấy, create_api_key() sẽ tạo ra một ApiKey kỷ lục mới, trong đó sẽ được liên quan đến việc gọi User. Bản ghi này cũng sẽ có một khóa HMAC khi nó được lưu vào bảng ApiKey. Khóa được tạo bởi hàm generate_key().

+0

hoàn hảo tuyệt vời ... cảm ơn. Vì vậy, nếu tôi thay đổi thông tin tài khoản của người dùng sẽ api thay đổi quan trọng sau đó là tốt (nói mật khẩu được thay đổi)? –

+1

Không, khóa API sẽ chỉ được tạo khi bản ghi người dùng mới được tạo ': https://docs.djangoproject.com/en/dev/ref/signals/#post-save. Về cơ bản, khi bản ghi 'User' mới được tạo, tham số' created = True' sẽ được gửi tới 'create_api_key()', việc cập nhật 'Người dùng' sẽ không được đặt' created = True' do đó không kích hoạt việc tạo ApiKey. –

+0

Cảm ơn. Điều cần biết –