2012-06-07 6 views
8

Was ich versuche zu tun ist, wenn der Benutzer einen API-Schlüssel anfordert - unabhängig davon, ob der Benutzer bereits einen generiert hat oder nicht - generiert das System einen völlig neuen Schlüssel.Hat Tastypie eine Hilfsfunktion, um API-Schlüssel zu generieren?

Ich weiß, dass beim Aufruf ApiKey.objects.create() wird generiert einen API-Schlüssel für den Benutzer, der nicht einen generiert hat. Wenn jedoch ein Benutzer einen hat, löst der Versuch, die .create()-Methode aufzurufen, einen Fehler aus.

In diesem Fall dachte ich, dass es am besten wäre, meinen eigenen Schlüsselgenerator zu schreiben. Ich hoffe jedoch, dass jemand hier vielleicht eine Hilfsfunktion kennt, die es mir ermöglicht, einen zufälligen API-Schlüssel zu generieren, und ihn dann selbst manuell in der Datenbank speichern zu lassen.

Würde jemand eine solche Hilfsfunktion kennen?

Antwort

5

Ich fand es heraus.

Zuerst versuchen Sie, den API-Schlüssel des Benutzers zu erhalten. Wenn es existiert, wird kein Fehler ausgelöst. Legen Sie den Wert des abgerufenen Benutzerschlüssels auf None fest, und speichern Sie dann den Schlüssel, um neu zu generieren.

Wenn ein Fehler ausgelöst wurde, erstellen Sie einfach einen neuen Schlüssel.

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

Ich würde die 'api_key.key = None bewegen; API-Schlüssel.save() 'aus dem try-Block, möglich in einen else-Block, um so genau wie möglich über das zu sein, was Sie versuchen. – Jamey

4

Ja, der Code für den Schlüssel zu erzeugen als eine Instanz Methode definiert ist ApiKey.generate_key(), die Sie direkt verwenden können.

Hier ist eine einfachere Version, die einige der Rätselraten herausnimmt, ob der Benutzer bereits existiert oder nicht und verwendet ApiKey.generate_key() direkt statt implizit durch ApiKey.save(), was es meiner Meinung nach etwas klarer macht, was versucht wird:

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

UPDATE:

Somit ist die kürzeste Version ist:

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

Dies erzeugt einen neuen Schlüssel oder gibt einen vorhandenen zurück.

+7

Vorsichtig damit. Ihr Code wird nicht funktionieren, da der Aufruf von 'get_or_create' ein Tupel zurückgibt, das durch das' ApiKey' erzeugte Objekt und einen booleschen Wert, nicht ein 'ApiKey'-Objekt gebildet wird. Der Schlüssel ist noch mit Ihrem ersten Satz erstellt, so dass Sie die Methode 'generate_key()' nicht erneut aufrufen müssen. Sie können nur den vom ersten Satz generierten Schlüssel sehen, indem Sie Folgendes eingeben: 'api_key [0] .key'. –

6

Oder Sie können einfach verwenden tastypie ist integrierte Befehl:

python manage.py backfill_api_keys 
0

Sein viel zu einfach eingebaute Funktionen zu nutzen, immer. Um Api-Schlüssel in Tastypie zu generieren, verwenden Sie "create_api_key" von Tastypie s ApikeyAuthentication`.

Sie müssen nur aus tastypie.modelscreate_api_key“ importieren und es dann durch django-signal oder rufen Sie per u erfordern.

heißt

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

in detaillierte Erklärung und einfacher an:

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

Verwandte Themen