我编写了一个 python 脚本来更改 AD 中的密码,该脚本在命令行中运行良好。现在我将该脚本传输到 Django 以创建更改密码页面。除了一件事之外,一切似乎都有效:出于某种原因,我在 Django 中不断收到一个 TypeError ,它建议应该将字符串而不是 unicode 对象传递给 AD。当然,当我这样做时,AD 会抗议,因为密码不再是 unicode。我猜我忽略了一些简单的东西,但我不知道是什么。
下面是我认为应该可以工作的 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
修改后的版本没有抛出异常,也没有修改密码(因为密码不是unicode传入的):
mod_attrs = [(ldap.MOD_DELETE, 'unicodePwd', [str(oldPassword)]),
(ldap.MOD_ADD, 'unicodePwd', [str(newPassword)])]
t.modify_s(dn, mod_attrs)
有谁知道什么可能导致这个 unicode 问题?如果我可以防止 Django 中的异常并保留 unicode,我认为这段代码会起作用。
提前感谢您提供的任何见解。