Django中的LDAP:需要将字符串密码作为字符串传递
问题描述:
我编写了一个python脚本来更改AD中的密码,该命令行可以很好地工作。现在我将该脚本转移到Django以创建更改密码页面。除了一件事之外,一切似乎都奏效:出于某种原因,我一直在Django中得到一个TypeError,它表明一个字符串而不是一个unicode对象应该传递给AD。当然,当我这样做时,AD会*,因为密码不再是unicode。我在猜测,我忽略了一些简单的事情,但我无法弄清楚什么。Django中的LDAP:需要将字符串密码作为字符串传递
下面是views.py代码,我认为应该工作(并且在命令行版本中工作)。我在密码中添加了unicode(),只是为了表明它们实际上是unicode,尽管它们在这些行之前肯定是unicode。
import ldap
def changePassword(request):
t = ldap.initialize(server)
. . .
t.simple_bind_s('**********', '****')
. . .
mod_attrs = [(ldap.MOD_DELETE, 'unicodePwd', [unicode(oldPassword)]),
(ldap.MOD_ADD, 'unicodePwd', [unicode(newPassword)])]
t.modify_s(dn, mod_attrs)
错误:
('expected a string in the list', u'pass!word')
Request Method: POST
Request URL: http://127.0.0.1:8000/index/
Django Version: 1.4.2
Exception Type: TypeError
Exception Value:
('expected a string in the list', u'pass!word')
Exception Location: /usr/lib/python2.7/dist-packages/ldap/ldapobject.py
in _ldap_call, line 96
Python Executable: /usr/bin/python
Python Version: 2.7.3
修改后的版本不会引发异常,但也没有更改密码(因为密码不统一通过):
mod_attrs = [(ldap.MOD_DELETE, 'unicodePwd', [str(oldPassword)]),
(ldap.MOD_ADD, 'unicodePwd', [str(newPassword)])]
t.modify_s(dn, mod_attrs)
有谁知道什么可能导致这个unicode问题?如果我可以阻止Django中的异常并保留unicode,我认为这个代码可以工作。
在此先感谢您提供的任何见解。
答
这似乎是一般Python Python模块的问题。一个快速解决方案是将所有Unicode字符串转换为str()
。我可以在OpenLDAP目录中以这种方式存储包括密码在内的属性。我直接使用python.ldap,而不是通过Django。
感谢您的回应!将所有unicode转换为字符串(包括来自Django表单的输入)完成这项工作。 –