2012-01-21 11 views
24

Quindi ho appena installato la mia prima applicazione django.ValueError: troppi valori per decomprimere Django

ho fatto un syncdb e creato il mio account di root per il sito.

Ora, quando accedo la pagina e premere il pulsante di login ottengo questo errore. Penso che abbia qualcosa a che fare con la password ma non ne sono sicuro.

ValueError at /accounts/login/ 
too many values to unpack 

sto usando la vista di accesso generica

(r'^accounts/login/$', login, {'template_name': 'authentication/login.html'}), 

che segue è la traceback

Environment: 


Request Method: POST 
Request URL: http://xx.xx.xx.xx:8888/accounts/login/?next=/some_page/ 

Django Version: 1.3.1 
Python Version: 2.7.2 
Installed Applications: 
['django.contrib.auth', 
'django.contrib.contenttypes', 
'django.contrib.sessions', 
'django.contrib.sites', 
'django.contrib.messages', 
'django.contrib.staticfiles', 
'django.contrib.admin', 
'bc_system_app', 
'django.contrib.humanize'] 
Installed Middleware: 
('django.middleware.common.CommonMiddleware', 
'django.contrib.sessions.middleware.SessionMiddleware', 
'django.middleware.csrf.CsrfViewMiddleware', 
'django.middleware.csrf.CsrfResponseMiddleware', 
'django.contrib.auth.middleware.AuthenticationMiddleware', 
'django.contrib.messages.middleware.MessageMiddleware') 


Traceback: 
File "/usr/local/lib/python2.7/dist-packages/django/core/handlers/base.py" in get_response 
    111.       response = callback(request, *callback_args, **callback_kwargs) 
File "/usr/local/lib/python2.7/dist-packages/django/utils/decorators.py" in _wrapped_view 
    93.      response = view_func(request, *args, **kwargs) 
File "/usr/local/lib/python2.7/dist-packages/django/views/decorators/cache.py" in _wrapped_view_func 
    79.   response = view_func(request, *args, **kwargs) 
File "/usr/local/lib/python2.7/dist-packages/django/contrib/auth/views.py" in login 
    35.   if form.is_valid(): 
File "/usr/local/lib/python2.7/dist-packages/django/forms/forms.py" in is_valid 
    121.   return self.is_bound and not bool(self.errors) 
File "/usr/local/lib/python2.7/dist-packages/django/forms/forms.py" in _get_errors 
    112.    self.full_clean() 
File "/usr/local/lib/python2.7/dist-packages/django/forms/forms.py" in full_clean 
    268.   self._clean_form() 
File "/usr/local/lib/python2.7/dist-packages/django/forms/forms.py" in _clean_form 
    296.    self.cleaned_data = self.clean() 
File "/usr/local/lib/python2.7/dist-packages/django/contrib/auth/forms.py" in clean 
    85.    self.user_cache = authenticate(username=username, password=password) 
File "/usr/local/lib/python2.7/dist-packages/django/contrib/auth/__init__.py" in authenticate 
    55.    user = backend.authenticate(**credentials) 
File "/usr/local/lib/python2.7/dist-packages/django/contrib/auth/backends.py" in authenticate 
    18.    if user.check_password(password): 
File "/usr/local/lib/python2.7/dist-packages/django/contrib/auth/models.py" in check_password 
    275.   return check_password(raw_password, self.password) 
File "/usr/local/lib/python2.7/dist-packages/django/contrib/auth/models.py" in check_password 
    42.  algo, salt, hsh = enc_password.split('$') 

Exception Type: ValueError at /accounts/login/ 
Exception Value: too many values to unpack 

risposta

11

Sì, c'è un problema nella password.

L'errore è nel modo in cui la password è stata criptata e memorizzati nel DB. Può essere visto chiaramente dalla dichiarazione algo, salt, hsh = enc_password.split('$') nel traceback. La suddivisione della password crittografata restituisce più di 3 valori.

Quindi, si prega di guardare gli schemi di crittografia password e relativi.

+0

Perché è così? Ho appena fatto un 'syncdb' e ho creato un utente quando richiesto. Ho anche guardato l'hash pw ci sono 3 '$' ... così che dividerei in 4 ... –

+0

Ho scoperto qual è il problema. Ho incasinato la chiave segreta mentre stavo armeggiando con le impostazioni. grazie –

+0

Strano. Sto ottenendo esattamente la stessa eccezione. Ho cambiato la mia chiave segreta ma sto ancora ricevendo lo stesso errore. – Burak

0

Ho avuto un problema simile. La password per il mio superutente era in qualche modo corrotta. Puoi verificarlo esaminando la tabella auth_user nel tuo database. La tua password dovrebbe essere qualcosa come "" sha1 $ 263a7 $ c17f83f1d1902fb7bd527d00ffcb22f4dc97a978 ". Se hai più di (o meno) due simboli" $ ", ti verrebbe un errore simile, il motivo per cui, come ha detto Sandip, è dovuto al fatto che seguente funzione prevede tre valori da restituire:.

algo, salt, hsh = enc_password.split('$')

Avere quel qualcosa in più "$" simbolo nella password sarebbe tornato quattro valori e provocare i "troppi valori di disfare" appaia messaggio di errore

La soluzione per me era creare un nuovo superutente utilizzando il comando creauperuser nello script manage.py. Ulteriori informazioni su come creare un superutente possono essere D qui:

https://docs.djangoproject.com/en/dev/topics/auth/

io non sono ancora sicuro perché la mia password è stato danneggiato.

+1

Stavi usando Django 1.4 alpha? Dai un'occhiata alla mia risposta .. –

+0

Ho anche avuto questo problema. Ho iniziato con Django 1.4 e poi sono tornato a 1.3 per mantenere la compatibilità con Grappelli. Ho creato il mio superutente quando ho installato 1.4 e il pattern di password predefinito non sembra retrocompatibile con 1.3. Cancellare il mio superutente e crearne uno nuovo ha funzionato per me. –

33

Appena avuto lo stesso problema.

sembra che nel mio caso, il sito è stato eseguito con Django 1.4 al momento della creazione della password (a causa di un PYTHONPATH mix-up).

Quando ho cercato di accedere in esecuzione il sito con 1.3.1 ho ottenuto questo errore. Poi ho notato la versione di Django, passata alla versione 1.4 e il login ha iniziato a funzionare di nuovo.

Sembra che l'algoritmo di password è stata modificata in 1.4:

https://docs.djangoproject.com/en/dev/releases/1.4-beta-1/#improved-password-hashing

E se si stesse utilizzando Django 1.4 alpha potrebbe anche essere che la password è stata effettivamente danneggiato (leggere l'avviso).

2

Ho fatto di tutto per risolvere lo stesso problema.Alla fine ho cancellato le tabelle db e ho fatto di nuovo syncdb, creando un nuovo superutente. Adesso funziona tutto bene. Il problema è legato ai cattivi dati utente, suppongo.

12

È possibile reimpostare la password nella shell.

from django.contrib.auth.models import User 
u = User.objects.get(username="myuser") 
u.set_password("mypassword") 
u.save() 

Questo succede quando eseguiamo il downgrade da 1.4.X per testare le vecchie distribuzioni come descritto da @ h3.

18

La soluzione più semplice è reimpostare la password dalla riga di comando.

./manage.py changepassword <user> 
Problemi correlati