我有一个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的实现没有被正确编码。我解决了这个问题:
-
我从settings.py文件中删除了django_bcrypt Django app:
INSTALLED_APPS = ( ... # django_bcrypt, ...)
-
然后我将此添加到settings.py:
FILE_CHARSET='UTF-8'
-
然后我简单地重置我的admin用户的密码,以便使用Django的默认哈希算法重新哈希密码。
python manage.py changepassword *username*
现在我能够再次使用我的windows工作站对本地开发服务器进行身份验证。我确信还有另一种工作可以让bcrypt与Django一起工作,但我只需要在我的工作站上进行开发和测试。