ValueError: слишком много значений для распаковки Django - PullRequest
24 голосов
/ 21 января 2012

Итак, я только что развернул свое первое приложение django.

Я сделал syncdb и создал свою учетную запись суперпользователя для сайта.

Теперь, когда я захожу на страницу и нажимаю кнопку входа, я получаю эту ошибку. Я думаю, что это как-то связано с паролем, но я не уверен.

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

Я использую общий вид входа в систему

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

Ниже приведена трассировка

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

Ответы [ 6 ]

33 голосов
/ 01 марта 2012

Просто была такая же проблема.

Кажется, что в моем случае сайт работал с Django 1.4, когда был создан пароль (из-за перепутывания PYTHONPATH).

Когда я пытался войти под управлением сайта с 1.3.1, я получил эту ошибку. Затем я заметил версию Django, переключился на 1.4, и логин снова начал работать.

Похоже, алгоритм паролей был изменен в 1.4:

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

А если вы использовали альфа-версию Django 1.4, возможно, пароль был действительно поврежден (прочитайте предупреждение).

18 голосов
/ 25 июля 2012

Самое простое решение - сбросить пароль из командной строки.

./manage.py changepassword <user>
12 голосов
/ 16 июля 2012

Вы можете сбросить пароль в оболочке.

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

Это происходит, когда мы понижаем версию с 1.4.X для тестирования старых развертываний, как описано в @ h3.

11 голосов
/ 21 января 2012

Да, в пароле есть проблема.

Ошибка в том, как пароль был зашифрован и сохранен в БД.Это хорошо видно из заявления algo, salt, hsh = enc_password.split('$') в следе.Разделение зашифрованных паролей возвращает более 3 значений.

Итак, ознакомьтесь со схемами шифрования паролей и связанными с ними.

2 голосов
/ 14 марта 2012

Я сделал все, чтобы решить ту же проблему.Наконец, я удалил таблицы db и снова сделал syncdb, создав нового суперпользователя.Теперь все отлично работает.Думаю, проблема связана с неверными данными пользователя.

0 голосов
/ 28 января 2012

У меня была похожая проблема. Пароль для моего суперпользователя был как-то поврежден. Вы можете проверить это, изучив таблицу auth_user в вашей базе данных. Ваш пароль должен выглядеть примерно так: следующая функция ожидает три значения, которые будут возвращены:

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

Наличие этого дополнительного символа «$» в вашем пароле вернет четыре значения и приведет к появлению сообщения об ошибке «слишком много значений для распаковки».

Решением для меня было создание нового суперпользователя с помощью команды createuperuser в сценарии manage.py. Более подробную информацию о том, как создать суперпользователя, можно найти здесь:

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

Я до сих пор не уверен, почему мой пароль был поврежден.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...