2012-06-07 20 views
8

Kullanmaya çalıştığım şey, kullanıcının bir API anahtarını istediğinde - kullanıcının önceden oluşturup oluşturmadığına bakılmaksızın - sistem tamamen yeni bir anahtar oluşturacaktır.Tastypie'nin API anahtarları oluşturmak için yardımcı bir işlevi var mı?

ApiKey.objects.create() numaralı telefonu arayarak, oluşturulmamış bir kullanıcı için bir API anahtarı üreteceğini biliyorum. Ancak, bir kullanıcı bir tane varsa, .create() yöntemini çağırmaya çalışırken bir hata atar. Bu durumda, kendi anahtar jeneratörümü yazmanın en iyi olacağını düşündüm. Ancak şimdi, belki de birisinin rastgele bir API anahtarı oluşturmama yardımcı olacak yardımcı bir işlevden haberdar olabileceğini ve sonra veritabanına kendim el ile kaydetmeme izin vereceğini umuyoruz.

Böyle bir yardımcı işlevden haberdar olabilir mi?

cevap

5

Bunu çözdüm.

İlk olarak, kullanıcının API anahtarını alma girişimi yaparsınız. Varsa, atılan bir hata olmayacaktır. Rejenere etmek için, alınan kullanıcının anahtarının değerini None olarak ayarlayın ve ardından anahtarı kaydedin.

Eğer bir hata atılmışsa, o zaman yeni bir anahtar oluşturun.

try: 
    api_key = ApiKey.objects.get(user=someuser) 
    api_key.key = None 
    api_key.save() 

except ApiKey.DoesNotExist: 
    api_key = ApiKey.objects.create(user=someuser) 
+0

I 'api_key.key = Yok hareket edeceğini; api_key.Denemek istediğiniz şey hakkında olabildiğince hassas olmak için, try bloğundan, başka bir bloğa mümkün olana kadar kaydedin. – Jamey

4

Evet anahtarı üretmek için kod doğrudan kullanabilir bir örnek yöntemi ApiKey.generate_key() olarak tanımlanır.

İşte yapar inanıyoruz ziyade örtülü ApiKey.save() kullanmak yerine, kullanıcının zaten değil var veya olmadığı varsayımları bazı alır ve doğrudan ApiKey.generate_key() kullanan basit bir sürümü, var biraz daha gerçekleştirilebilir çalıştığı şey daha net:

api_key = ApiKey.objects.get_or_create(user=someuser) 
api_key.key = api_key.generate_key() 
api_key.save() 

Update:

Böylece, kısa bir versiyonu:

return ApiKey.objects.get_or_create(user=someuser)[0].key 

Bu, yeni bir anahtar oluşturur veya varolan bir tanesini döndürür.

+7

Buna dikkat edin. "Get_or_create" ifadesi, "ApiKey" nesnesinin oluşturduğu bir tuple ve bir "ApiKey" nesnesi değil, bir boolean değeri döndürdüğü için kodunuz çalışmaz. Anahtar, ilk cümlenizle oluşturulmuştur, bu yüzden tekrar "generate_key()" yöntemini çağırmanız gerekmez. İlk cümle tarafından oluşturulan anahtarı sadece yazarak görebilirsiniz: api_key [0] .key'. –

6

Veya, sadece tastypie yerleşik oluyor komutu kullanabilirsiniz:

python manage.py backfill_api_keys 
0

Onun yol çok kolay, her zaman dahili fonksiyonlarını kullanmak. Tastypie numaralı telefondan Api anahtarları oluşturmak için Tastypie s ApikeyAuthentication`'in "create_api_key" kullanın.

sadece tastypie.models gelen " create_api_key" ithal ve sonra django-signal veya u gerektirir başı olarak aramak zorunda.

yani ayrıntılı ve en kolay Açıklaması

signals.post_save.connect(create_api_key, sender=User) 

:

http://django-tastypie.readthedocs.org/en/latest/authentication.html#apikeyauthentication

İlgili konular