2014-02-14 60 views
0

我有一個Pyro4守護進程,我想返回一個連接到LDAP(由python-ldap模塊實例化)。代碼很簡單,但是當我嘗試將連接返回到客戶端腳本時,我遇到了(我相信)連接對象序列化的錯誤。如何從Pyro4守護程序返回複雜對象類型(python-ldap連接)?

class LDAPDaemon(object): 
    def get_ldap_connection(self): 
     conn = ldap.initialize("ldap://ds1") 
     conn.simple_bind_s("cn=Directory Manager", "abc123") 
     return conn 

daemon = Pyro4.Daemon(unixsocket="/tmp/ldap_unix.sock") 
os.system("chmod 700 /tmp/ldap_unix.sock") 
uri=daemon.register(LDAPDaemon(), "LDAPDaemon") 
daemon.requestLoop() 

然後在我的驅動程序腳本,我有以下的(假設URI是已知的,砍了這一切,爲簡潔起見):

with Pyro4.Proxy(uri) as ldap_daemon: 
    conn = ldap_daemon.get_ldap_connection() 

這將導致以下錯誤:

Traceback (most recent call last): 
    File "./tester.py", line 14, in <module> 
    conn = ldap_daemon.get_ldap_connection() 
    File "/opt/csw/lib/python2.6/site-packages/Pyro4/core.py", line 160, in __call__ 
    return self.__send(self.__name, args, kwargs) 
    File "/opt/csw/lib/python2.6/site-packages/Pyro4/core.py", line 318, in _pyroInvoke 
    raise data 
AttributeError: __class__ 

我試着改變Pyro4配置接受不同的串行器,即:

Pyro4.config.SERIALIZERS_ACCEPTED = set(['json', 'marshal', 'serpent', 'pickle']) 

但這並沒有改變任何東西。

請忽略那些明顯的安全漏洞,因爲這是最基本的錯誤代碼。

+0

是否要將打開的連接發送到另一個進程,以便此進程和客戶端都具有此打開的連接,而不僅僅是代理到客戶端的連接? – User

+0

代理不需要連接,我只需要它打開連接並將它交給調用進程,因爲它是唯一訪問必要密碼的進程。 – CptSupermrkt

回答

1

你猜對了。 LDAPOject不可序列化。 傳遞給遠程對象的參數及其方法的返回值被序列化,然後通過套接字發送。不可序列化的對象將導致錯誤。您應該考慮用戶的評論,爲連接創建代理,而不是將其發送到其他進程,或者您必須找到將其序列化的方法。