2012-02-17 142 views
2

即時通訊運行到這個問題,因爲我試圖在我的osX10.7,python2.7 django1.4系統上運行一段django代碼。我如何獲得get_hexdigest?我從哪裏下載它?ImportError:無法導入名稱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 
+0

也許你應該張貼在創建代碼這個錯誤。特別是用戶模型的黑客攻擊 – 2012-02-17 07:36:21

+0

Django安裝程序出錯。該功能應該在那裏。嘗試打開文件本身,在那裏? – DrTyrsa 2012-02-17 07:54:38

+0

我在哪裏可以找到這個文件? – henghonglee 2012-02-17 08:09:16

回答

3

您正在使用Django(1.4)的dev的版本,並且在對應的模塊沒有get_hexdigest方法。

解決方案:

  • 使用1.3版本(這是最後穩定在目前)
  • 實現get_hexdigest自己(可以從here被copypasted)
  • 使用另一種工具(即不具有兼容性問題)來解決你的任務
+0

我設法做到了第二種方式,它正在工作,但我不確定這是否是一種正確的方式來做到這一點,以及是否會產生其他問題。你的回答讓我感覺更安全。謝謝! – henghonglee 2012-02-18 16:06:54

1

你是否正在使用它來加密密碼進行比較。原來的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(密碼[,鹽,hashers]) 創建在由本申請中使用的格式的哈希密碼。它需要一個強制參數:以純文本形式輸入密碼。或者,如果您不想使用默認值(PASSWORD_HASHERS設置的第一項),則可以提供使用的salt和散列算法。目前支持的算法是:'pbkdf2_sha256','pbkdf2_sha1','bcrypt_sha256'(參見使用bcrypt和Django),'bcrypt','sha1','md5','unsalted_md5'(僅用於向後兼容)和'crypt'if你已經安裝了crypt庫。如果密碼參數是None,則返回一個不可用的密碼(一個將不會被check_password()接受的密碼)。

is_password_usable(encoded_pa​​ssword) 檢查,如果給定的字符串是具有被證實對check_password機會()散列密碼。

遺留代碼

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)) 
2

實現自己的方法(使用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.") 
相關問題