ImportError: невозможно импортировать имя get_hexdigest - PullRequest
2 голосов
/ 17 февраля 2012

я сталкиваюсь с этой проблемой, когда пытаюсь запустить кусок кода django в моей системе osX10.7, python2.7 django1.4.как получить get_hexdigest?я могу скачать его откуда-то?

Kinnovates-MacBook-Pro:platformsite Kinnovate$ sudo python manage.py runserver
Running in development mode.
Running in development mode.
Running in development mode.
Running in development mode.
Validating models...

HACKUING USER MODEL
Unhandled exception in thread started by <bound method Command.inner_run of <django.contrib.staticfiles.management.commands.runserver.Command object at 0x1016bc050>>
Traceback (most recent call last):
  File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/django/core/management/commands/runserver.py", line 91, in inner_run
    self.validate(display_num_errors=True)
  File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/django/core/management/base.py", line 266, in validate
    num_errors = get_validation_errors(s, app)
  File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/django/core/management/validation.py", line 30, in get_validation_errors
    for (app_name, error) in get_app_errors().items():
  File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/django/db/models/loading.py", line 158, in get_app_errors
    self._populate()
  File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/django/db/models/loading.py", line 67, in _populate
    self.load_app(app_name)
  File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/django/db/models/loading.py", line 88, in load_app
    models = import_module('.models', app_name)
  File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/django/utils/importlib.py", line 35, in import_module
    __import__(name)
  File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/django_sha2-0.4-py2.7.egg/django_sha2/models.py", line 2, in <module>
    from django_sha2 import auth
  File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/django_sha2-0.4-py2.7.egg/django_sha2/auth.py", line 96, in <module>
    monkeypatch()
  File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/django_sha2-0.4-py2.7.egg/django_sha2/auth.py", line 42, in monkeypatch
    from django_sha2 import bcrypt_auth
  File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/django_sha2-0.4-py2.7.egg/django_sha2/bcrypt_auth.py", line 10, in <module>
    from django.contrib.auth.models import get_hexdigest
ImportError: cannot import name get_hexdigest

Ответы [ 3 ]

3 голосов
/ 17 февраля 2012

Вы используете dev версию Django (1.4), и в соответствующем модуле нет метода get_hexdigest.

Решения:

  • использовать версию 1.3 (это последняя стабильная версия на данный момент)
  • реализовать get_hexdigest самостоятельно (его можно скопировать с здесь )
  • используйте другой инструмент (у которого нет проблем с совместимостью) для решения вашей задачи
2 голосов
/ 06 января 2014

реализовать метод самостоятельно (используя hashlib вместо hashcompat):

import hashlib
from django.utils.encoding import smart_str


def get_hexdigest(algorithm, salt, raw_password):
    """
    Returns a string of the hexdigest of the given plaintext password and salt
    using the given algorithm ('md5', 'sha1' or 'crypt').
    """
    raw_password, salt = smart_str(raw_password), smart_str(salt)
    if algorithm == 'crypt':
        try:
            import crypt
        except ImportError:
            raise ValueError('"crypt" password algorithm not supported in this environment')
        return crypt.crypt(raw_password, salt)

    if algorithm == 'md5':
        return hashlib.md5(salt + raw_password).hexdigest()
    elif algorithm == 'sha1':
        return hashlib.sha1(salt + raw_password).hexdigest()
    raise ValueError("Got unknown password algorithm type in password.")
1 голос
/ 18 июня 2013

Скорее всего, вы используете его для шифрования паролей для сравнения.Оказывается, Django 1.5 (также 1.4?) Теперь предлагает лучшую полезную функцию:

https://docs.djangoproject.com/en/dev/topics/auth/passwords/#auth-password-storage

В частности:

check_password (пароль, закодированный) Если вы хотите вручную аутентифицировать пользователя, сравнивая простой текстовый пароль с хешированным паролем в базе данных, используйте вспомогательную функцию check_password ().Он принимает два аргумента: текстовый пароль для проверки и полное значение поля пароля пользователя в базе данных для проверки и возвращает True, если они совпадают, False в противном случае.

make_password (пароль [, соль, хэши]) Создает хешированный пароль в формате, используемом этим приложением.Требуется один обязательный аргумент: пароль в виде простого текста.При желании вы можете предоставить алгоритм соли и хэширования, если не хотите использовать значения по умолчанию (первая запись параметра PASSWORD_HASHERS).В настоящее время поддерживаются следующие алгоритмы: «pbkdf2_sha256», «pbkdf2_sha1», «bcrypt_sha256» (см. «Использование bcrypt с Django»), «bcrypt», «sha1», «md5», «unsalted_md5» (только для обратной совместимости) и «crypt», еслиу вас установлена ​​библиотека crypt.Если аргумент пароля равен None, возвращается неиспользуемый пароль (тот, который никогда не будет принят check_password ()).

is_password_usable (encoded_password) Проверяет, является ли данная строка хешированнойпароль, который может быть проверен с помощью check_password ().

Legacy Code

def check_master_password(raw_password):
  from django.conf import settings
  from django.contrib.auth.models import get_hexdigest

  enc_password = getattr(settings, 'MASTER_PASSWORD', None)
  if enc_password:
    algo, salt, hsh = enc_password.split('$')
    return hsh == get_hexdigest(algo, salt, raw_password)

Новый 1.5 Код

def check_master_password(raw_password):
  from django.conf import settings
  from django.contrib.auth.hashers import check_password
  return check_password(raw_password, getattr(settings, 'MASTER_PASSWORD', None))
...