2012-04-12 4 views
9

Fino Django 1.2.5 ho potuto utilizzare il seguente codice per creare un utente per il test e quindi accedere in:Creare una password semplice per l'utente unittest utilizzando 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) 

Ora utilizzando lo stesso codice con Django 1.4 non funziona più:

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

Ho capito che questo ha a che fare con il nuovo sistema di hashing delle password. Non uso l'impostazione PASSWORD_HASHERS, quindi Django dovrebbe utilizzare alcuni valori predefiniti.

I documenti di Django sono piuttosto scarsi su come implementare qualcosa del genere ora. Nella sezione di test non è cambiato nulla. E dalla sezione sulla creazione di password e su come hash loro, ho potuto vedere che probabilmente potrei creare una password in questo modo:

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

Ma questo solleva solo in questo eception nella prima riga (quando si crea l'utente, non è quando si assegna la password):

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

Questo è un problema con Django non accettare le password vuote, così ho cambiato che a:

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

e quindi provare a registrare l'u ser in genere:

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

Che ora solleva un sospiro AssertionError: False is not True - quasi mi aspettavo che ...

La mia domanda ora è: come posso creare un utente con una password, e accedere a questo utente con il client di prova django?

risposta

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

Naturalmente. salva ... Grazie - così ovvio. La seconda soluzione è la più elegante, probabilmente la userò. Nel caso tu sia interessato, ho trovato una terza soluzione che ho intenzione di pubblicare adesso. – marue

+1

Intendevi questo? Probabilmente potresti trovare anche il mio interestin ...;) – marue

13

Durante la ricerca di una soluzione che ho trovato una cosa che avrebbe funzionato, allthough io probabilmente usare la soluzione Thomas User.objects.create_user, come quello è davvero semplice .

Ma per quel che vale, questo è quello che si avvicinò con:

from django.contrib.auth.hashers import make_password 

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

funziona anche bene.


Come ho appena scoperto, questo è estremamente utile durante la creazione di dispositivi manualmente. Quando si crea un appuntamento fisso per testare probabilmente si desidera che un utente come questo:

username: user_01 password: password_01

Ma come faccio a sapere che cosa password_01 sarebbe simile a quando viene generato un hash? Quel valore di hash è ciò che deve essere memorizzato nell'attrezzatura per il test e make_password sta facendo esattamente questo: crea gli hash delle password da una password. Basta scrivere il valore di ritorno di make_password('password_01') sull'apparecchio e il gioco è fatto.

Problemi correlati