Django di sé.client.login(…) non funziona in unità di test

Ho creato gli utenti per il mio test di unità in due modi:

1) Creare un appuntamento fisso per “auth.utente” che guarda all’incirca come questo:

    { 
        "pk": 1, 
        "model": "auth.user", 
        "fields": { 
            "username": "homer", 
            "is_active": 1, 
            "password": 
"sha1$72cd3$4935449e2cd7efb8b3723fb9958fe3bb100a30f2", 
            ... 
        } 
    }

Ho lasciato fuori l’apparentemente insignificante parti.

2) Uso ‘create_user’ nella funzione setUp (anche se preferisco tenere
tutto nella mia apparecchi di classe):

def setUp(self): 
       User.objects.create_user('homer', '[email protected]', 'simpson') 

Di notare che la password è simpson in entrambi i casi.

Ho verificato che questa info sia correttamente caricata nel database di test di volta in volta. Posso prendere l’oggetto Utente tramite l’Utente.oggetti.ottenere. Posso verificare che la password è corretta, utilizzando la ‘check_password.’ L’utente è attivo.

Di sicurezza, invariabilmente, di sé.client.login(username=’omero’, password=’rossi’) non RIESCE. Io sono sconcertato perché. Credo di aver letto ogni singola discussione su Internet riguardo a questo. C’è qualcuno che può aiutarmi?

Il codice di login nel mio test di unità assomiglia a questo:

    login = self.client.login(username='homer', password='simpson') 
    self.assertTrue(login) 

Grazie.

  • Qual è il messaggio di errore che hai ottenuto?
  • Il test in caso di esito negativo sulla linea, ‘auto.assertTrue(login)”; il login() la funzione restituisce False.
  • In pratica ho copiato&incollato il 2 ° variazione e funziona su Django 1.3. Puoi postare il codice intero anche le importazioni?
  • Questo è stato sepolto da qualche parte in una base di codice non ho più accesso. Se mi imbatto in un problema sarò sicuro di follow-up, ma, per la cronaca, è stato con una versione precedente di Django; penso 1.0.2.
InformationsquelleAutor thebossman | 2010-04-11

 

6 Replies
  1. 94

    Il codice che non funziona:

    from django.contrib.auth.models import User
    from django.test import Client
    
    user = User.objects.create(username='testuser', password='12345')
    
    c = Client()
    logged_in = c.login(username='testuser', password='12345')

    Perché non c’è lavoro?

    Nel frammento di sopra, quando il User è creata la password hash è impostato per essere 12345. Quando il client chiama il login metodo, il valore della password argomento, 12345, è passato attraverso la funzione di hash, con conseguente qualcosa come

    hash('12345') = 'adkfh5lkad438....'

    Questo viene quindi confrontato con il dato memorizzato nel database, e il client viene negato l’accesso perché 'adkfh5lkad438....' != '12345'

    La Soluzione

    La cosa giusta da fare è chiamare il set_password funzione, che passa la stringa data tramite la funzione di hash, e memorizza il risultato in User.password.

    Inoltre, dopo la chiamata set_password dobbiamo salvare l’aggiornamento User oggetto nel database:

    user = User.objects.create(username='testuser')
    user.set_password('12345')
    user.save()
    
    c = Client()
    logged_in = c.login(username='testuser', password='12345')
    • È possibile utilizzare User.objects.create_superuser() e User.objects.create_user() che eseguire esattamente questo set_password() chiamata.
    • come circa quando si accede a una persona in
    • per aggiungere a @vdboor commento: si noti che, poiché Django 1.4 anche User.objects.get_or_create() esegue la richiesta set_password() chiamata
  2. 40

    Un modo più semplice è quello di utilizzare force_login, di nuovo in Django 1.9.

    force_login(user, backend=None)

    Per esempio:

    class LoginView(TestCase):
        def setUp(self):
            self.client.force_login(User.objects.get_or_create(username='testuser')[0])
  3. 5

    Si può controllare, come di seguito,

    from django.test import TransactionTestCase, Client
    
    class UserHistoryTest(TransactionTestCase):
        self.user = User.objects.create(username='admin', password='[email protected]', email='[email protected]')
        self.client = Client() # May be you have missed this line
    
        def test_history(self):
            self.client.login(username=self.user.username, password='[email protected]')
            # get_history function having login_required decorator
            response = self.client.post(reverse('get_history'), {'user_id': self.user.id})
            self.assertEqual(response.status_code, 200)

    Questo test ha funzionato per me.

  4. 0
    from django.test import TestCase
    from django.contrib.auth.models import User
    from django.test import Client
    class MyProfile(TestCase):
        @classmethod
        def setUpClass(self):
            self.username = 'dummy' + data + '@gmail.com'
            self.password = '[email protected]'
            user = User.objects.create(username=self.username)
            user.set_password(self.password)
            user.save()
            c = Client()
            self.client_object = c.login(username=self.username, password=self.password)
            self.content_type = "application/json"
            response = self.client_object.post('/api/my-profile/', content_type=self.content_type)
  5. 0

    Se ancora qualcuno che segue questo , penso che gli attributi ‘is_staff’ e ‘is_active’ deve essere tenuto Vero per completare l’accesso……

    self.user = User.objects.create(username='testuser',password='pwd',is_active=1,is_staff=1)

    • Questo appena lavorato……….. auto.utente = Utente.oggetti.creare(username=’username’, password=’12345′, is_active=True, is_staff=True, is_superuser=True) self.utente.set_password(‘ciao’) self.utente.save() utente = autenticazione(username=’username’, password=’ciao’) login = self.c.login(username=’username’, password=’ciao’) self.assertTrue(login)
    • Questo non ha nulla a che fare con is_staff che definisce se l’accesso al pannello di amministrazione, in generale, è concesso. Come si può vedere i dati della rilevazione iniziale ha già is_active = 1 e che anche il valore di default per User.objects.create().
    • Wow, che in realtà ha funzionato.. (il Tuo commento, che è)
    • Potrebbe essere un problema di versione, ma ho dovuto commentare il tuo autenticare chiamata. Oltre a questo, il tuo commento ha lavorato come un campione! Ulteriori test di pensiero, ho trovato che is_active, is_superuser, e is_staff sono stati tutti inutili. La cosa che ha fatto è stato l’appello di set_password.

Lascia un commento