Документация Python неофициальный перевод

xmlrpclib.md

445 строк · 31.8 КБ · обычная страница · сырой текст · скачать

1> **Источник:** https://python-all.ru/2.7/library/xmlrpclib.html2>3> «Документация Python на русском» – неофициальный перевод официальной документации Python: версии от 2.6 до 3.16, полнотекстовый поиск, английский оригинал рядом с переводом. Эта Markdown-версия страницы предназначена для работы с LLM: вставьте её в ChatGPT, Claude или Cursor.45---67# 20.23. [`xmlrpclib`](https://python-all.ru/2.7/library/xmlrpclib.html#module-xmlrpclib) – клиентский доступ XML-RPC89> **Примечание**10>11> Модуль [`xmlrpclib`](https://python-all.ru/2.7/library/xmlrpclib.html#module-xmlrpclib) в Python 3 переименован в `xmlrpc.client`. Инструмент [2to3](https://python-all.ru/2.7/glossary.html#term-2to3) при преобразовании исходного кода в Python 3 автоматически адаптирует импорты.1213Новое в версии 2.2.1415**Исходный код:** [Lib/xmlrpclib.py](https://python-all.ru/src/2.7/Lib/xmlrpclib.py)1617---1819XML-RPC – это метод удалённого вызова процедур (Remote Procedure Call), использующий XML, передаваемый через HTTP(S) в качестве транспорта. С его помощью клиент может вызывать методы с параметрами на удалённом сервере (сервер задаётся URI) и получать структурированные данные. Этот модуль предназначен для написания кода XML-RPC клиента; он берёт на себя все детали преобразования между совместимыми объектами Python и XML, передаваемыми по сети.2021> **Предупреждение**22>23> Модуль [`xmlrpclib`](https://python-all.ru/2.7/library/xmlrpclib.html#module-xmlrpclib) не защищён от вредоносных данных. Если требуется разбирать непроверенные или неаутентифицированные данные, см. [уязвимости XML](https://python-all.ru/2.7/library/xml.html#xml-vulnerabilities).2425Изменено в версии 2.7.9: Для URI HTTPS [`xmlrpclib`](https://python-all.ru/2.7/library/xmlrpclib.html#module-xmlrpclib) теперь по умолчанию выполняет все необходимые проверки сертификата и имени хоста.2627#### `class xmlrpclib.ServerProxy(uri[, transport[, encoding[, verbose[, allow_none[, use_datetime[, context]]]]]])`2829Экземпляр [`ServerProxy`](https://python-all.ru/2.7/library/xmlrpclib.html#xmlrpclib.ServerProxy) – это объект, управляющий связью с удалённым XML-RPC сервером. Обязательный первый аргумент – URI (Uniform Resource Indicator), обычно это URL сервера. Второй необязательный аргумент – экземпляр транспортной фабрики; по умолчанию для URL https: используется внутренний экземпляр `SafeTransport`, а в остальных случаях – внутренний экземпляр HTTP `Transport`. Третий необязательный аргумент – кодировка, по умолчанию UTF-8. Четвёртый необязательный аргумент – флаг отладки.3031Следующие параметры управляют использованием возвращаемого экземпляра прокси. Если *allow\_none* имеет значение true, то константа Python `None` будет преобразована в XML; по умолчанию `None` вызывает исключение [`TypeError`](https://python-all.ru/2.7/library/exceptions.html#exceptions.TypeError). Это широко используемое расширение спецификации XML-RPC, но оно поддерживается не всеми клиентами и серверами; см. [http://ontosys.com/xml-rpc/extensions.php](https://python-all.ru/2.7/library/xmlrpclib.html). Флаг *use\_datetime* можно использовать для представления значений даты/времени в виде объектов [`datetime.datetime`](https://python-all.ru/2.7/library/datetime.html#datetime.datetime); по умолчанию это false. Объекты [`datetime.datetime`](https://python-all.ru/2.7/library/datetime.html#datetime.datetime) могут передаваться в вызовы.3233И HTTP, и HTTPS транспорты поддерживают расширение синтаксиса URL для HTTP-базовой аутентификации: `http://user:pass@host:port/path`. Часть `user:pass` будет закодирована в base64 как HTTP-заголовок 'Authorization' и отправлена на удалённый сервер в процессе подключения при вызове метода XML-RPC. Это нужно использовать только в том случае, если удалённый сервер требует имя пользователя и пароль для базовой аутентификации. Если указан HTTPS URL, *context* может быть [`ssl.SSLContext`](https://python-all.ru/2.7/library/ssl.html#ssl.SSLContext) и настраивает параметры SSL нижележащего HTTPS-соединения.3435Возвращаемый экземпляр – это прокси-объект с методами, которые можно использовать для вызова соответствующих RPC-вызовов на удалённом сервере. Если удалённый сервер поддерживает API интроспекции, прокси также можно использовать для запроса методов, которые он поддерживает (обнаружение служб), и получения других метаданных, связанных с сервером.3637Типы, которые являются совместимыми (т.е. могут быть преобразованы в XML), включают следующие (и, если не указано иное, они десериализуются как те же типы Python):3839| Тип XML-RPC | Тип Python |40| --- | --- |41| `boolean` | [`bool`](https://python-all.ru/2.7/library/functions.html#bool) |42| `int` или `i4` | [`int`](https://python-all.ru/2.7/library/functions.html#int) или [`long`](https://python-all.ru/2.7/library/functions.html#long) в диапазоне от -2147483648 до 2147483647. |43| `double` | [`float`](https://python-all.ru/2.7/library/functions.html#float) |44| `string` | [`str`](https://python-all.ru/2.7/library/functions.html#str) или [`unicode`](https://python-all.ru/2.7/library/functions.html#unicode) |45| `array` | `list` или [`tuple`](https://python-all.ru/2.7/library/functions.html#tuple), содержащие совместимые элементы. Массивы возвращаются как `lists`. |46| `struct` | [`dict`](https://python-all.ru/2.7/library/stdtypes.html#dict). Ключи должны быть строками, значения могут быть любого совместимого типа. Можно передавать объекты пользовательских классов; передаётся только их атрибут [`__dict__`](https://python-all.ru/2.7/library/stdtypes.html#object.__dict__). |47| `dateTime.iso8601` | [`DateTime`](https://python-all.ru/2.7/library/xmlrpclib.html#xmlrpclib.DateTime) или [`datetime.datetime`](https://python-all.ru/2.7/library/datetime.html#datetime.datetime). Возвращаемый тип зависит от значений флагов *use\_datetime*. |48| `base64` | [`Binary`](https://python-all.ru/2.7/library/xmlrpclib.html#xmlrpclib.Binary) |49| `nil` | Константа `None`. Передача разрешена только если *allow\_none* равен true. |5051Это полный набор типов данных, поддерживаемых XML-RPC. Вызовы методов также могут вызывать специальный экземпляр [`Fault`](https://python-all.ru/2.7/library/xmlrpclib.html#xmlrpclib.Fault), используемый для сигнализации об ошибках сервера XML-RPC, или [`ProtocolError`](https://python-all.ru/2.7/library/xmlrpclib.html#xmlrpclib.ProtocolError), используемый для сигнализации об ошибке на уровне транспорта HTTP/HTTPS. Оба [`Fault`](https://python-all.ru/2.7/library/xmlrpclib.html#xmlrpclib.Fault) и [`ProtocolError`](https://python-all.ru/2.7/library/xmlrpclib.html#xmlrpclib.ProtocolError) происходят от базового класса `Error`. Обратите внимание, что, хотя начиная с Python 2.2 можно создавать подклассы встроенных типов, модуль xmlrpclib в настоящее время не маршалирует экземпляры таких подклассов.5253При передаче строк символы, специальные для XML, такие как `<`, `>` и `&`, будут автоматически экранированы. Однако вызывающая сторона должна убедиться, что строка не содержит символов, запрещённых в XML, например управляющих символов с ASCII-значениями от 0 до 31 (за исключением, конечно, табуляции, перевода строки и возврата каретки); несоблюдение этого приведёт к тому, что XML-RPC-запрос не будет корректным XML. Если необходимо передавать произвольные строки через XML-RPC, используйте класс-обёртку [`Binary`](https://python-all.ru/2.7/library/xmlrpclib.html#xmlrpclib.Binary), описанный ниже.5455`Server` сохранён как псевдоним для [`ServerProxy`](https://python-all.ru/2.7/library/xmlrpclib.html#xmlrpclib.ServerProxy) для обратной совместимости. В новом коде следует использовать [`ServerProxy`](https://python-all.ru/2.7/library/xmlrpclib.html#xmlrpclib.ServerProxy).5657Изменено в версии 2.5: Был добавлен флаг *use\_datetime*.5859Изменено в версии 2.6: Экземпляры [классов нового стиля](https://python-all.ru/2.7/glossary.html#term-new-style-class) можно передавать, если они имеют *\_\_dict\_\_* атрибут и не имеют базового класса, который маршалируется особым образом.6061Изменено в версии 2.7.9: Добавлен аргумент *context*.6263> **См. также**64>65> **[Руководство по XML-RPC](https://python-all.ru/2.7/library/xmlrpclib.html)**66>67> Хорошее описание работы XML-RPC и клиентского ПО на нескольких языках. Содержит практически всё, что нужно знать разработчику XML-RPC клиента.68>69> **[Интроспекция XML-RPC](https://python-all.ru/2.7/library/xmlrpclib.html)**70>71> Описывает расширение протокола XML-RPC для интроспекции.72>73> **[Спецификация XML-RPC](https://python-all.ru/2.7/library/xmlrpclib.html)**74>75> Официальная спецификация.76>77> **[Неофициальные исправления XML-RPC](https://python-all.ru/2.7/library/xmlrpclib.html)**78>79> «Неофициальные исправления» Фредрика Лунда, предназначенные для разъяснения некоторых деталей спецификации XML-RPC, а также для указания на «лучшие практики» при разработке собственных реализаций XML-RPC.8081## 20.23.1. Объекты ServerProxy8283Экземпляр [`ServerProxy`](https://python-all.ru/2.7/library/xmlrpclib.html#xmlrpclib.ServerProxy) имеет метод, соответствующий каждому удаленному вызову процедуры, принимаемому XML-RPC сервером. Вызов метода выполняет RPC, диспетчеризуемый по имени и сигнатуре аргументов (например, одно и то же имя метода может быть перегружено несколькими сигнатурами аргументов). RPC завершается возвратом значения, которое может быть либо возвращенными данными в совместимом типе, либо [`Fault`](https://python-all.ru/2.7/library/xmlrpclib.html#xmlrpclib.Fault) или [`ProtocolError`](https://python-all.ru/2.7/library/xmlrpclib.html#xmlrpclib.ProtocolError) объектом, указывающим на ошибку.8485Серверы, поддерживающие API интроспекции XML, предоставляют несколько общих методов, сгруппированных в зарезервированном атрибуте `system`:8687#### `ServerProxy.system.listMethods()`8889Этот метод возвращает список строк, по одной для каждого (не системного) метода, поддерживаемого XML-RPC сервером.9091#### `ServerProxy.system.methodSignature(name)`9293Этот метод принимает один параметр – имя метода, реализованного XML-RPC сервером. Он возвращает массив возможных сигнатур для этого метода. Сигнатура – это массив типов. Первый из этих типов – возвращаемый тип метода, остальные – параметры.9495Поскольку допускается несколько сигнатур (т.е. перегрузка), этот метод возвращает список сигнатур, а не один элемент.9697Сигнатуры ограничены параметрами верхнего уровня, ожидаемыми методом. Например, если метод ожидает один массив структур в качестве параметра и возвращает строку, его сигнатура – просто «string, array». Если он ожидает три целых числа и возвращает строку, его сигнатура – «string, int, int, int».9899Если для метода не определена сигнатура, возвращается не-массив. В Python это означает, что тип возвращаемого значения будет чем-то отличным от list.100101#### `ServerProxy.system.methodHelp(name)`102103Этот метод принимает один параметр – имя метода, реализованного XML-RPC сервером. Он возвращает строку документации, описывающую использование этого метода. Если такая строка отсутствует, возвращается пустая строка. Строка документации может содержать HTML-разметку.104105## 20.23.2. Логические объекты106107Этот класс может быть инициализирован любым значением Python; возвращаемый экземпляр зависит только от его истинностного значения. Он поддерживает различные операторы Python через методы [`__cmp__()`](https://python-all.ru/2.7/reference/datamodel.html#object.__cmp__), [`__repr__()`](https://python-all.ru/2.7/reference/datamodel.html#object.__repr__), [`__int__()`](https://python-all.ru/2.7/reference/datamodel.html#object.__int__) и [`__nonzero__()`](https://python-all.ru/2.7/reference/datamodel.html#object.__nonzero__), реализованные очевидным образом.108109Также он имеет следующий метод, предназначенный главным образом для внутреннего использования кодом демаршалинга:110111#### `Boolean.encode(out)`112113Записывает XML-RPC-кодирование этого логического элемента в объект потока out.114115Далее следует работающий пример. Код сервера:116117```python118import xmlrpclib119from SimpleXMLRPCServer import SimpleXMLRPCServer120121def is_even(n):122    return n % 2 == 0123124server = SimpleXMLRPCServer(("localhost", 8000))125print "Listening on port 8000..."126server.register_function(is_even, "is_even")127server.serve_forever()128```129130Клиентский код для указанного сервера:131132```python133import xmlrpclib134135proxy = xmlrpclib.ServerProxy("http://localhost:8000/")136print "3 is even: %s" % str(proxy.is_even(3))137print "100 is even: %s" % str(proxy.is_even(100))138```139140## 20.23.3. Объекты DateTime141142#### `class xmlrpclib.DateTime`143144Этот класс можно инициализировать секундами с начала эпохи, временным кортежем, строкой даты/времени в формате ISO 8601 или экземпляром [`datetime.datetime`](https://python-all.ru/2.7/library/datetime.html#datetime.datetime). Он имеет следующие методы, поддерживаемые в основном для внутреннего использования кодом маршалинга/демаршалинга:145146#### `decode(string)`147148Принимает строку в качестве нового значения времени экземпляра.149150#### `encode(out)`151152Записывает XML-RPC кодировку этого элемента [`DateTime`](https://python-all.ru/2.7/library/xmlrpclib.html#xmlrpclib.DateTime) в потоковый объект *out* .153154Он также поддерживает некоторые встроенные операторы Python через [`__cmp__()`](https://python-all.ru/2.7/reference/datamodel.html#object.__cmp__) и [`__repr__()`](https://python-all.ru/2.7/reference/datamodel.html#object.__repr__).155156Далее следует работающий пример. Код сервера:157158```python159import datetime160from SimpleXMLRPCServer import SimpleXMLRPCServer161import xmlrpclib162163def today():164    today = datetime.datetime.today()165    return xmlrpclib.DateTime(today)166167server = SimpleXMLRPCServer(("localhost", 8000))168print "Listening on port 8000..."169server.register_function(today, "today")170server.serve_forever()171```172173Клиентский код для указанного сервера:174175```python176import xmlrpclib177import datetime178179proxy = xmlrpclib.ServerProxy("http://localhost:8000/")180181today = proxy.today()182# преобразует строку в формате ISO8601 в объект datetime183converted = datetime.datetime.strptime(today.value, "%Y%m%dT%H:%M:%S")184print "Today: %s" % converted.strftime("%d.%m.%Y, %H:%M")185```186187## 20.23.4. Объекты Binary188189#### `class xmlrpclib.Binary`190191Этот класс может быть инициализирован строковыми данными (которые могут включать NUL). Основной доступ к содержимому объекта [`Binary`](https://python-all.ru/2.7/library/xmlrpclib.html#xmlrpclib.Binary) предоставляется через атрибут:192193#### `data`194195Двоичные данные, инкапсулированные экземпляром [`Binary`](https://python-all.ru/2.7/library/xmlrpclib.html#xmlrpclib.Binary). Данные предоставляются в виде 8-битной строки.196197Объекты [`Binary`](https://python-all.ru/2.7/library/xmlrpclib.html#xmlrpclib.Binary) имеют следующие методы, предназначенные в основном для внутреннего использования кодом маршалинга/демаршалинга:198199#### `decode(string)`200201Принимает строку в base64 и декодирует её как новые данные экземпляра.202203#### `encode(out)`204205Записывает XML-RPC base64-кодировку этого двоичного объекта в потоковый объект *out*.206207Закодированные данные будут содержать символы новой строки каждые 76 символов согласно [RFC 2045, раздел 6.8](https://python-all.ru/2.7/library/xmlrpclib.html), что было фактическим стандартом спецификации base64 на момент написания спецификации XML-RPC.208209Он также поддерживает некоторые встроенные операторы Python через метод [`__cmp__()`](https://python-all.ru/2.7/reference/datamodel.html#object.__cmp__).210211Пример использования двоичных объектов. Мы собираемся передать изображение через XMLRPC:212213```python214from SimpleXMLRPCServer import SimpleXMLRPCServer215import xmlrpclib216217def python_logo():218     with open("python_logo.jpg", "rb") as handle:219         return xmlrpclib.Binary(handle.read())220221server = SimpleXMLRPCServer(("localhost", 8000))222print "Listening on port 8000..."223server.register_function(python_logo, 'python_logo')224225server.serve_forever()226```227228Клиент получает изображение и сохраняет его в файл:229230```python231import xmlrpclib232233proxy = xmlrpclib.ServerProxy("http://localhost:8000/")234with open("fetched_python_logo.jpg", "wb") as handle:235    handle.write(proxy.python_logo().data)236```237238## 20.23.5. Объекты Fault239240#### `class xmlrpclib.Fault`241242Объект [`Fault`](https://python-all.ru/2.7/library/xmlrpclib.html#xmlrpclib.Fault) инкапсулирует содержимое тега ошибки (fault tag) XML-RPC. Объекты Fault имеют следующие атрибуты:243244#### `faultCode`245246Строка, указывающая тип ошибки.247248#### `faultString`249250Строка, содержащая диагностическое сообщение, связанное с ошибкой.251252В следующем примере мы намеренно вызовем [`Fault`](https://python-all.ru/2.7/library/xmlrpclib.html#xmlrpclib.Fault), возвращая объект сложного типа. Код сервера:253254```python255from SimpleXMLRPCServer import SimpleXMLRPCServer256257# Произойдёт ошибка маршалинга, потому что возвращается258# комплексное число259def add(x, y):260    return x+y+0j261262server = SimpleXMLRPCServer(("localhost", 8000))263print "Listening on port 8000..."264server.register_function(add, 'add')265266server.serve_forever()267```268269Клиентский код для указанного сервера:270271```python272import xmlrpclib273274proxy = xmlrpclib.ServerProxy("http://localhost:8000/")275try:276    proxy.add(2, 5)277except xmlrpclib.Fault as err:278    print "A fault occurred"279    print "Fault code: %d" % err.faultCode280    print "Fault string: %s" % err.faultString281```282283## 20.23.6. Объекты ProtocolError284285#### `class xmlrpclib.ProtocolError`286287Объект [`ProtocolError`](https://python-all.ru/2.7/library/xmlrpclib.html#xmlrpclib.ProtocolError) описывает протокольную ошибку на уровне нижележащего транспорта (например, ошибку 404 «не найдено», если сервер по указанному URI не существует). Он имеет следующие атрибуты:288289#### `url`290291URI или URL, вызвавший ошибку.292293#### `errcode`294295Код ошибки.296297#### `errmsg`298299Сообщение об ошибке или диагностическая строка.300301#### `headers`302303Строка, содержащая заголовки HTTP/HTTPS-запроса, вызвавшего ошибку.304305В следующем примере мы намеренно вызовем [`ProtocolError`](https://python-all.ru/2.7/library/xmlrpclib.html#xmlrpclib.ProtocolError), указав URI, не указывающий на сервер XMLRPC:306307```python308import xmlrpclib309310# Создание ServerProxy с URI, который не отвечает на XMLRPC-запросы311proxy = xmlrpclib.ServerProxy("http://www.google.com/")312313try:314    proxy.some_method()315except xmlrpclib.ProtocolError as err:316    print "A protocol error occurred"317    print "URL: %s" % err.url318    print "HTTP/HTTPS headers: %s" % err.headers319    print "Error code: %d" % err.errcode320    print "Error message: %s" % err.errmsg321```322323## 20.23.7. Объекты MultiCall324325Новое в версии 2.4.326327Объект [`MultiCall`](https://python-all.ru/2.7/library/xmlrpclib.html#xmlrpclib.MultiCall) позволяет инкапсулировать несколько вызовов к удалённому серверу в один запрос [1](https://python-all.ru/2.7/library/xmlrpclib.html#id7).328329#### `class xmlrpclib.MultiCall(server)`330331Создаёт объект для группировки вызовов методов. *server* – конечная цель вызова. Вызовы могут направляться результирующему объекту, но они сразу же возвращают `None`, и сохраняют только имя метода и параметры в объект [`MultiCall`](https://python-all.ru/2.7/library/xmlrpclib.html#xmlrpclib.MultiCall). Вызов самого объекта приводит к передаче всех сохранённых вызовов в виде одного запроса `system.multicall`. Результатом этого вызова является [generator](https://python-all.ru/2.7/glossary.html#term-generator); итерация по этому генератору даёт отдельные результаты.332333Пример использования этого класса приведён ниже. Код сервера334335```python336from SimpleXMLRPCServer import SimpleXMLRPCServer337338def add(x,y):339    return x+y340341def subtract(x, y):342    return x-y343344def multiply(x, y):345    return x*y346347def divide(x, y):348    return x/y349350# Простой сервер с простыми арифметическими функциями351server = SimpleXMLRPCServer(("localhost", 8000))352print "Listening on port 8000..."353server.register_multicall_functions()354server.register_function(add, 'add')355server.register_function(subtract, 'subtract')356server.register_function(multiply, 'multiply')357server.register_function(divide, 'divide')358server.serve_forever()359```360361Клиентский код для указанного сервера:362363```python364import xmlrpclib365366proxy = xmlrpclib.ServerProxy("http://localhost:8000/")367multicall = xmlrpclib.MultiCall(proxy)368multicall.add(7,3)369multicall.subtract(7,3)370multicall.multiply(7,3)371multicall.divide(7,3)372result = multicall()373374print "7+3=%d, 7-3=%d, 7*3=%d, 7/3=%d" % tuple(result)375```376377## 20.23.8. Вспомогательные функции378379#### `xmlrpclib.boolean(value)`380381Преобразует любое значение Python в одну из логических констант XML-RPC: `True` или `False`.382383#### `xmlrpclib.dumps(params[, methodname[, methodresponse[, encoding[, allow_none]]]])`384385Преобразует *params* в запрос XML-RPC. Или в ответ, если *methodresponse* истинно. *params* может быть кортежем аргументов или экземпляром [`Fault`](https://python-all.ru/2.7/library/xmlrpclib.html#xmlrpclib.Fault) класса исключения. Если *methodresponse* истинно, только одно значение может быть возвращено, то есть *params* должен иметь длину 1. *encoding*, если указан, это кодировка для генерируемого XML; по умолчанию UTF-8. Значение [`None`](https://python-all.ru/2.7/library/constants.html#None) Python не может использоваться в стандартном XML-RPC; чтобы разрешить его использование через расширение, передайте истинное значение для *allow\_none*.386387#### `xmlrpclib.loads(data[, use_datetime])`388389Преобразует XML-RPC-запрос или ответ в объекты Python, `(params, methodname)`. *params* – кортеж аргументов; *methodname* – строка или `None`, если имя метода отсутствует в пакете. Если XML-RPC-пакет представляет условие ошибки, эта функция вызовет исключение [`Fault`](https://python-all.ru/2.7/library/xmlrpclib.html#xmlrpclib.Fault). Флаг *use\_datetime* можно использовать, чтобы значения даты/времени представлялись как объекты [`datetime.datetime`](https://python-all.ru/2.7/library/datetime.html#datetime.datetime); по умолчанию false.390391Изменено в версии 2.5: Был добавлен флаг *use\_datetime*.392393## 20.23.9. Пример использования клиента394395```python396# простая тестовая программа (из спецификации XML-RPC)397from xmlrpclib import ServerProxy, Error398399# server = ServerProxy("http://localhost:8000") # локальный сервер400server = ServerProxy("http://betty.userland.com")401402print server403404try:405    print server.examples.getStateName(41)406except Error as v:407    print "ERROR", v408```409410Для доступа к XML-RPC серверу через HTTP-прокси необходимо определить собственный транспорт. В следующем примере показано, как это сделать:411412```python413import xmlrpclib, httplib414415class ProxiedTransport(xmlrpclib.Transport):416    def set_proxy(self, proxy):417        self.proxy = proxy418419    def make_connection(self, host):420        self.realhost = host421        h = httplib.HTTPConnection(self.proxy)422        return h423424    def send_request(self, connection, handler, request_body):425        connection.putrequest("POST", 'http://%s%s' % (self.realhost, handler))426427    def send_host(self, connection, host):428        connection.putheader('Host', self.realhost)429430p = ProxiedTransport()431p.set_proxy('proxy-server:8080')432server = xmlrpclib.ServerProxy('http://time.xmlrpc.com/RPC2', transport=p)433print server.currentTime.getCurrentTime()434```435436## 20.23.10. Пример использования клиента и сервера437438См. [пример SimpleXMLRPCServer](https://python-all.ru/2.7/library/simplexmlrpcserver.html#simplexmlrpcserver-example).439440Сноски441442**[1](https://python-all.ru/2.7/library/xmlrpclib.html#id6)**443444Этот подход был впервые представлен в [обсуждении на xmlrpc.com](https://python-all.ru/2.7/library/xmlrpclib.html).445