Система YourDocs предоставляет свои функции по протоколу XML-RPC. Идентификация пользователя выполняется по адресу сессии, который должен быть передан системе в виде кукиса с именем SESADDR. Проблема заключает в том, что библиотека xmlrpclib "из коробки" не умеет отсылать кукисы вовсе (по крайней мере мне стандартный способ решения этой задачи неизвестен).
Натолкнувшись на вариант, описанный здесь, создал свой класс транспорта, в котором был переопределен всего один метод - send_request:
class YourDocsSimpleCookieTransport(xmlrpclib.Transport):VERBOSE = Falsedef __init__(self, server):xmlrpclib.Transport.__init__(self)self.server = serverself.verbose = self.VERBOSEself._cookie = Nonedef setSessionAddress(self, session_address):self._cookie = Cookie.SimpleCookie()self._cookie['SESADDR'] = session_addressdef send_request(self, connection, handler, request_body):connection.putrequest("POST", '%s' % (handler))if self._cookie:connection.putheader ('Set-Cookie',str(self._cookie)[len('Set-Cookie: '):])
Схема использования транспорта следующая:
# Создаем транспортtransport = YourDocsSimpleCookieTransport()# Создаем Proxy-объект с использованием этого транспортаserver = xmlrpclib.ServerProxy("http://newdocs/RPC2", transport=transport)# Входим в систему, получая адрес сессииsession_address = server.Login.login('yourdocs:test', 'password',{'passwd':'ValidPassword'})# Устанавливаем текущий адрес сессииtransport.setSessionAddress(session_address)# Работаем с функциями системыprint server.Session.whoami()# Закрываем сессиюserver.Session.close()