如何从Pyro4守护进程返回复杂对象类型(pythonldap连接)?

2024-09-30 01:18:55 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个Pyro4守护进程,我希望它返回到LDAP的连接(由PythonLDAP模块实例化)。代码很短很简单,但是我在尝试将连接返回到客户机脚本时遇到了一个错误(我相信)connection对象的序列化。在

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已知,为了简洁起见,请删去所有这些内容):

^{pr2}$

导致以下错误:

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'])

但这并没有改变什么。在

请忽略这些明显的安全漏洞,因为这被简化为产生错误的最基本代码。在


Tags: 代码inpyself脚本序列化错误line
1条回答
网友
1楼 · 发布于 2024-09-30 01:18:55

你猜对了。ldap对象不可序列化。 传递给远程对象的参数及其方法的返回值被序列化,然后通过套接字发送。不可序列化的对象将导致错误。您应该考虑用户的注释,为连接创建一个代理,而不是将其发送到另一个进程,或者您必须找到一种方法来序列化它。在

相关问题 更多 >

    热门问题