2012-04-12 17 views
9

Hasta Django 1.2.5 i podría utilizar el siguiente código para crear un usuario para realizar pruebas e inicie sesión en:Crear una contraseña simple para el usuario unittest usando PASSWORD_HASHERS

class TestSomeLoginRequiredView(TestCase): 
    urls = 'sonloop.tests.test_urls' 

    def setUp(self): 
     self.user = User.objects.create(username='testuser',password='some_password') 


    def test_the_view(self): 
     response = self.client.get('/test_view_url/') 
     self.assertEqual(response.status_code,401) 

     self.client.login(username='testuser',password='some_password') 
     response = self.client.get('/test_view_url/') 
     self.assertEqual(response.status_code,200) 

Ahora, utilizando el mismo código con Django 1.4 no funciona más:

ValueError: Unknown password hashing algorithm 'some_password'. Did you specify it in the PASSWORD_HASHERS setting?

Entiendo que esto tiene que ver con el nuevo sistema hashing de contraseñas. No utilizo la configuración PASSWORD_HASHERS, por lo que Django debería usar algunos valores predeterminados.

Los documentos de Django son bastante escasos sobre cómo implementar algo así ahora. En la sección de prueba, nada ha cambiado. Y a partir de la sección sobre la creación de contraseñas y la forma de hash de ellos, pude ver que probablemente podría crear una contraseña de esta manera:

self.user = User.objects.create(username='testuser') 
self.user.set_password('some_password') 

Pero eso sólo aumenta esta eception en la primera línea (al crear el usuario, no al asignar la contraseña):

ValueError: Unknown password hashing algorithm ''. Did you specify it in the PASSWORD_HASHERS setting?

Este es un problema con Django no aceptar contraseñas vacías, así que cambió a que:

self.user = User.objects.create(username='testuser',password='!') 
self.user.set_password('some_password') 

y luego tratar de registrar la U Ser en el estilo:

login = self.client.login(username='testuser',password='some_password') 
self.assertTrue(login) 

Que ahora plantea una AssertionError: False is not True suspiro - Casi esperaba que ...

Mi pregunta ahora es: ¿Cómo puedo crear un usuario con una contraseña, y registrar este usuario en con el cliente de prueba django?

Respuesta

13
self.user = User.objects.create(username='testuser',password='!') 
self.user.set_password('some_password') 
self.user.save() # <--- You need this ;) 

O: from here

self.user = User.objects.create_user(username='user', email='[email protected]', password='pass') 
+0

Por supuesto. guardar ... Gracias, tan obvio. La segunda solución es más elegante, probablemente use esto. En caso de que esté interesado, mientras tanto, encontré una tercera solución que voy a publicar en este momento. – marue

+1

¿Te refieres a esta? Probablemente también puedas encontrar el interés de la mina ...;) – marue

13

bien la búsqueda de una solución que encontré una cosa más que trabajar, acabase i lo más probable es utilizar la solución de Thomas User.objects.create_user, ya que es muy sencillo .

Pero para lo que vale, eso es lo que ocurrió:

from django.contrib.auth.hashers import make_password 

pwd = make_password('some_password') 
self.user = User.objects.create(username='testuser', password = pwd) 

funciona bien también.


Como acabo de descubrir esto es extremadamente útil cuando se crean accesorios manualmente. Cuando se crea un aparato para la prueba es probable que desee un usuario como éste:

username: user_01 password: password_01

Pero ¿cómo sé lo password_01 se vería como cuando es ordenado? Ese valor hash es lo que se debe almacenar en el dispositivo para probar, y make_password está haciendo exactamente eso: crea hashes de contraseña a partir de una contraseña. Simplemente escriba el valor de retorno de make_password('password_01') en el dispositivo y listo.

Cuestiones relacionadas