2012-06-07 10 views
8

Lo que intento hacer cuando el usuario solicita una clave API, independientemente de si el usuario ya generó una o no, el sistema generará una clave completamente nueva.¿Tiene Tastypie una función auxiliar para generar claves API?

Sé que siempre que se llame ApiKey.objects.create() se generará una clave API para el usuario que no tiene una generada. Sin embargo, si un usuario tiene tiene uno, intentar llamar al método .create() arroja un error.

En este caso, pensé que sería mejor escribir mi propio generador de claves. Sin embargo, ahora espero que alguien aquí conozca una función auxiliar que me permita generar una clave API aleatoria, y luego me permita guardarla manualmente en la base de datos.

¿Alguien podría saber de alguna de estas funciones auxiliares?

Respuesta

5

Me di cuenta.

Primero, intenta obtener la clave de API del usuario. Si existe, no se generará ningún error. Para regenerar, establezca el valor de la clave del usuario recuperado en None y guarde la clave.

Si se produjo un error, simplemente cree una nueva clave.

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

Movería el 'api_key.key = Ninguna; Clave API.save() 'fuera del bloque try, posible en un bloque else, para ser lo más preciso posible sobre lo que estás intentando. – Jamey

4

Sí, el código para generar la clave se define como un método de instancia ApiKey.generate_key() que se puede utilizar directamente.

Aquí hay una versión más simple que se lleva a cabo algunas de las conjeturas de si el usuario ya existe o no y utiliza ApiKey.generate_key() directamente, en lugar de forma implícita a través ApiKey.save(), que creo que hace que sea un poco más clara de lo que está tratando de llevarse a cabo:

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

ACTUALIZACIÓN:

Por lo tanto, la versión más corta es:

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

Esto generará una nueva clave o devolverá una existente.

+7

Cuidado con eso. Su código no funcionará, ya que al llamar 'get_or_create' devuelve una tupla formada por el objeto' ApiKey' creado y un valor booleano, no un objeto 'ApiKey'. La clave ya está creada con su primera oración, por lo que no necesita volver a llamar al método 'generate_key()'. Puede ver la clave generada por la primera oración escribiendo: 'api_key [0] .key'. –

6

O bien, puede simplemente usar tastypie incorporado en el comando:

python manage.py backfill_api_keys 
0

Su demasiado fácil de utilizar las funciones incorporadas, siempre. Para generar claves Api en Tastypie utilice "create_api_key" de Tastypie s ApikeyAuthentication`.

que tienen que acaba de importar "create_api_key" de tastypie.models y luego llamarlo por django-signal o según u requieren.

es decir

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

Explicado en detalle y más fácil en:

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

Cuestiones relacionadas