2012-12-11 145 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表單的輸入)完成這項工作。 –