ValueError: слишком много значений для распаковки Django
Итак, я только что открыл свое первое приложение 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
Ответы
Ответ 1
Да, в пароле есть проблема.
Ошибка в том, как пароль был зашифрован и сохранен в БД. Это ясно видно из утверждения algo, salt, hsh = enc_password.split('$')
в трассировке. Зашифрованное разделение пароля возвращает более 3 значений.
Итак, просмотрите схемы шифрования паролей и связанные с ними.
Ответ 2
У вас была такая же проблема.
Кажется, что в моем случае сайт работал с 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 alpha, может также быть, что пароль был эффективно поврежден (прочитайте предупреждение).
Ответ 3
Самое простое исправление заключается в reset вашем пароле из командной строки.
./manage.py changepassword <user>
Ответ 4
Вы можете reset пароль в оболочке.
from django.contrib.auth.models import User
u = User.objects.get(username="myuser")
u.set_password("mypassword")
u.save()
Это происходит, когда мы понижаем рейтинг с 1.4.X для тестирования старых развертываний, как описано в @h3.
Ответ 5
Я сделал все, чтобы решить ту же проблему. Наконец, я удалил таблицы db и снова сделал syncdb, создав новый суперпользователь. Сейчас все работает отлично. Я думаю, проблема связана с плохими пользовательскими данными.
Ответ 6
У меня была аналогичная проблема. Пароль для моего суперпользователя был как-то испорчен. Вы можете проверить это, изучив таблицу auth_user в своей базе данных. Ваш пароль должен быть чем-то вроде "sha1 $263a7 $c17f83f1d1902fb7bd527d00ffcb22f4dc97a978".Если у вас есть больше (или меньше) двух символов "$", вы получите аналогичную ошибку. Причина этого, как отметил Сандип, состоит в том, что следующая функция ожидает возврата трех значений:
algo, salt, hsh = enc_password.split('$')
Наличие этого дополнительного символа "$" в вашем пароле вернет четыре значения и вызовет появление сообщения об ошибке "слишком много значений для распаковки".
Решение для меня состояло в том, чтобы создать новый суперпользователь, используя команду createuperuser в файле manage.py script. Более подробную информацию о создании суперпользователя можно найти здесь:
https://docs.djangoproject.com/en/dev/topics/auth/
Я все еще не уверен, почему мой пароль был поврежден.