2012-12-11 146 views
4

我编写了一个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,我认为这个代码可以工作。

在此先感谢您提供的任何见解。

回答

4

这似乎是一般Python Python模块的问题。一个快速解决方案是将所有Unicode字符串转换为str()。我可以在OpenLDAP目录中以这种方式存储包括密码在内的属性。我直接使用python.ldap,而不是通过Django。

+0

感谢您的回应!将所有unicode转换为字符串(包括来自Django表单的输入)完成这项工作。 –