У меня есть демон Pyro4, который хотел бы вернуть соединение с LDAP (созданный модулем python-ldap). Код короткий и простой, но я столкнулся с ошибкой с (я считаю) сериализации объекта соединения при попытке вернуть соединение с клиентским скриптом.Как я могу вернуть сложный тип объекта (соединение python-ldap) из Daemon Pyro4?
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()
Тогда в моем сценарии водителя, у меня есть следующее (предположим, что Ури известно, вырезать все, что за ради краткости):
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'])
но это ничего не меняет.
Просьба игнорировать яркие дыры в безопасности, поскольку это было подавлено до самого базового кода, чтобы вызвать ошибку.
Вы хотите отправить открытое соединение другому процессу, чтобы этот процесс и клиент имели это открытое соединение, а не только прокси-сервер для клиентского соединения? – User
Прокси не нуждается в подключении, мне просто нужно открыть его и передать его вызывающему процессу, потому что это единственный процесс с доступом к нужному паролю. – CptSupermrkt