django.contrib.auth utf-8 ascii python 'Unicode-objects 必须在哈希之前进行编码'



我有一个Django web项目,它最初是在Linux机器(UTF-8)上编写的,我将git存储库代码克隆到我的windows机器上。当从内置开发web服务器访问Django的管理界面时,我无法进行身份验证。在Django shell中运行了几个身份验证调用之后,发现有一个编码问题。是的,我知道最好的解决方案是不使用微软的Windows,但这是我公司为我提供/决定的开发环境。

不幸的是,将此添加到我的设置文件中无法在windows上工作:

import locale
locale.setlocale(locale.LC_ALL, 'UTF-8') 

From VS 2013 PTVS version 2.2 Immediate Window C:Python27Libsite-packagesdjangocontribauthbackend .py:

user.set_password('mark')
None
user.save()
None
user.check_password('mark')
True
user.check_password('mark')
error: Unicode-objects must be encoded before hashing
user.password
u'bc$$2b$12$FaJjXbx.DupiSJvLJbGg7.YLDd6Ci8wS9BdASm0z94SRttMb.MFwO'

您可以通过将密码散列和密码变量字符串转换为ASCII来解决Unicode问题:

password = password.encode('ascii')
None
user.check_password(password)
True

显然这是错误的方法,我宁愿将默认编码设置为'UTF-8',以便Python全局运行这个Django项目。

我怎样才能最好地解决这个问题?

注意:在windows机器上创建新的django项目工作得很好,因为它们是默认的ASCII编码。同时,系统。Setdefaultencoding不再是一个选项…无论如何,这可能会引发更多问题。我没有时间把我们所有的应用都升级到Python 3.x。

原来Django包Django -bcrypt==0.9.2中bcrypt的实现没有被正确编码。我解决了这个问题:

  1. 我从settings.py文件中删除了django_bcrypt Django app:

    INSTALLED_APPS = ( ...
    # django_bcrypt,
    ...)
    
  2. 然后我将此添加到settings.py:

    FILE_CHARSET='UTF-8'
    
  3. 然后我简单地重置我的admin用户的密码,以便使用Django的默认哈希算法重新哈希密码。

    python manage.py changepassword *username* 
    

现在我能够再次使用我的windows工作站对本地开发服务器进行身份验证。我确信还有另一种工作可以让bcrypt与Django一起工作,但我只需要在我的工作站上进行开发和测试。

最新更新