【问题标题】:django.contrib.auth utf-8 ascii python 'Unicode-objects must be encoded before hashing'django.contrib.auth utf-8 ascii python 'Unicode 对象必须在散列之前进行编码'
【发布时间】:2016-01-15 20:45:21
【问题描述】:

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

不幸的是,将此添加到我的设置文件中不适用于 Windows:

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

从 VS 2013 PTVS 2.2 版即时窗口 C:\Python27\Lib\site-packages\django\contrib\auth\backends.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 编码。此外, sys.setdefaultencoding 不再是一个选项......无论如何它可能会导致更多问题。我没有时间将我们所有的应用程序升级到 Python 3.x。

【问题讨论】:

    标签: python django unicode utf-8 ascii


    【解决方案1】:

    原来 Django 包 django-bcrypt==0.9.2 中的 bcrypt 实现没有正确编码。我通过以下方式解决了问题:

    1. 我从 settings.py 文件中删除了 django_bcrypt Django 应用程序:

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

      FILE_CHARSET='UTF-8'
      
    3. 然后我只需重置我的管理员用户的密码,以便使用 Django 的默认哈希算法重新哈希密码。

      python manage.py changepassword *username* 
      

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-10-12
      • 1970-01-01
      • 2020-03-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多