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

simplexmlrpcserver.md

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

1> **Источник:** https://python-all.ru/2.7/library/simplexmlrpcserver.html2>3> «Документация Python на русском» – неофициальный перевод официальной документации Python: версии от 2.6 до 3.16, полнотекстовый поиск, английский оригинал рядом с переводом. Эта Markdown-версия страницы предназначена для работы с LLM: вставьте её в ChatGPT, Claude или Cursor.45---67# 20.24. [`SimpleXMLRPCServer`](https://python-all.ru/2.7/library/simplexmlrpcserver.html#module-SimpleXMLRPCServer) – Базовый XML-RPC сервер89> **Примечание**10>11> Модуль [`SimpleXMLRPCServer`](https://python-all.ru/2.7/library/simplexmlrpcserver.html#module-SimpleXMLRPCServer) был объединён с `xmlrpc.server` в Python 3. Инструмент [2to3](https://python-all.ru/2.7/glossary.html#term-2to3) автоматически адаптирует импорты при преобразовании исходного кода в Python 3.1213Новое в версии 2.2.1415**Исходный код:** [Lib/SimpleXMLRPCServer.py](https://python-all.ru/src/2.7/Lib/SimpleXMLRPCServer.py)1617---1819Модуль [`SimpleXMLRPCServer`](https://python-all.ru/2.7/library/simplexmlrpcserver.html#module-SimpleXMLRPCServer) предоставляет базовый каркас сервера для XML-RPC серверов на Python. Серверы могут быть как автономными, с использованием [`SimpleXMLRPCServer`](https://python-all.ru/2.7/library/simplexmlrpcserver.html#SimpleXMLRPCServer.SimpleXMLRPCServer), так и встроенными в CGI-среду, с использованием [`CGIXMLRPCRequestHandler`](https://python-all.ru/2.7/library/simplexmlrpcserver.html#SimpleXMLRPCServer.CGIXMLRPCRequestHandler).2021#### `class SimpleXMLRPCServer.SimpleXMLRPCServer(addr[, requestHandler[, logRequests[, allow_none[, encoding[, bind_and_activate]]]])`2223Создаёт новый экземпляр сервера. Этот класс предоставляет методы для регистрации функций, которые могут быть вызваны протоколом XML-RPC. Параметр *requestHandler* должен быть фабрикой экземпляров обработчика запросов; по умолчанию он равен [`SimpleXMLRPCRequestHandler`](https://python-all.ru/2.7/library/simplexmlrpcserver.html#SimpleXMLRPCServer.SimpleXMLRPCRequestHandler). Параметры *addr* и *requestHandler* передаются конструктору [`SocketServer.TCPServer`](https://python-all.ru/2.7/library/socketserver.html#SocketServer.TCPServer). Если *logRequests* равен true (по умолчанию), запросы будут регистрироваться; установка этого параметра в false отключает журналирование. Параметры *allow\_none* и *encoding* передаются в [`xmlrpclib`](https://python-all.ru/2.7/library/xmlrpclib.html#module-xmlrpclib) и управляют XML-RPC ответами, возвращаемыми сервером. Параметр *bind\_and\_activate* управляет тем, вызываются ли `server_bind()` и `server_activate()` немедленно конструктором; по умолчанию true. Установка его в false позволяет коду манипулировать переменной класса *allow\_reuse\_address* до привязки адреса.2425Изменено в версии 2.5: Добавлены параметры *allow\_none* и *encoding*.2627Изменено в версии 2.6: Добавлен параметр *bind\_and\_activate*.2829#### `class SimpleXMLRPCServer.CGIXMLRPCRequestHandler([allow_none[, encoding]])`3031Создаёт новый экземпляр для обработки XML-RPC запросов в CGI-среде. Параметры *allow\_none* и *encoding* передаются в [`xmlrpclib`](https://python-all.ru/2.7/library/xmlrpclib.html#module-xmlrpclib) и управляют XML-RPC ответами, возвращаемыми сервером.3233Новое в версии 2.3.3435Изменено в версии 2.5: Добавлены параметры *allow\_none* и *encoding*.3637#### `class SimpleXMLRPCServer.SimpleXMLRPCRequestHandler`3839Создаёт новый экземпляр обработчика запросов. Этот обработчик поддерживает запросы `POST` и изменяет логирование так, чтобы параметр *logRequests* конструктора [`SimpleXMLRPCServer`](https://python-all.ru/2.7/library/simplexmlrpcserver.html#SimpleXMLRPCServer.SimpleXMLRPCServer) учитывался.4041## 20.24.1. Объекты SimpleXMLRPCServer4243Класс [`SimpleXMLRPCServer`](https://python-all.ru/2.7/library/simplexmlrpcserver.html#SimpleXMLRPCServer.SimpleXMLRPCServer) основан на [`SocketServer.TCPServer`](https://python-all.ru/2.7/library/socketserver.html#SocketServer.TCPServer) и предоставляет средства для создания простых автономных XML-RPC серверов.4445#### `SimpleXMLRPCServer.register_function(function[, name])`4647Регистрирует функцию, которая может отвечать на запросы XML-RPC. Если указан *name*, он будет именем метода, ассоциированного с *function*, в противном случае будет использовано `function.__name__`. *name* может быть обычной или Unicode-строкой и может содержать символы, недопустимые в идентификаторах Python, включая точку.4849#### `SimpleXMLRPCServer.register_instance(instance[, allow_dotted_names])`5051Регистрирует объект, который используется для предоставления доступа к именам методов, не зарегистрированных с помощью [`register_function()`](https://python-all.ru/2.7/library/simplexmlrpcserver.html#SimpleXMLRPCServer.SimpleXMLRPCServer.register_function). Если *instance* содержит метод `_dispatch()`, он вызывается с именем запрошенного метода и параметрами из запроса. Его API: `def _dispatch(self, method, params)` (обратите внимание, что *params* не представляет собой список переменных аргументов). Если для выполнения задачи вызывается нижележащая функция, она вызывается как `func(*params)`, с развёртыванием списка параметров. Возвращаемое значение `_dispatch()` возвращается клиенту как результат. Если *instance* не имеет метода `_dispatch()`, в нём ищется атрибут, соответствующий имени запрошенного метода.5253Если необязательный аргумент *allow\_dotted\_names* равен true и экземпляр не имеет метода `_dispatch()`, то если имя запрошенного метода содержит точки, каждый компонент имени метода ищется отдельно, в результате чего выполняется простой иерархический поиск. Найденное значение затем вызывается с параметрами из запроса, а возвращаемое значение передаётся обратно клиенту.5455> **Предупреждение**56>57> Включение опции *allow\_dotted\_names* позволяет злоумышленникам получить доступ к глобальным переменным вашего модуля и может позволить им выполнить произвольный код на вашей машине. Используйте эту опцию только в безопасной закрытой сети.5859Изменено в версиях 2.3.5 и 2.4.1: Добавлен параметр *allow\_dotted\_names* для закрытия дыры в безопасности; предыдущие версии небезопасны.6061#### `SimpleXMLRPCServer.register_introspection_functions()`6263Регистрирует функции интроспекции XML-RPC: `system.listMethods`, `system.methodHelp` и `system.methodSignature`.6465Новое в версии 2.3.6667#### `SimpleXMLRPCServer.register_multicall_functions()`6869Регистрирует функцию мультивызова XML-RPC system.multicall.7071#### `SimpleXMLRPCRequestHandler.rpc_paths`7273Значение атрибута, которое должно быть кортежем, перечисляющим допустимые части пути URL для приёма XML-RPC запросов. Запросы, отправленные на другие пути, приведут к HTTP-ошибке 404 «страница не найдена». Если кортеж пуст, все пути считаются допустимыми. Значение по умолчанию – `('/', '/RPC2')`.7475Новое в версии 2.5.7677#### `SimpleXMLRPCRequestHandler.encode_threshold`7879Если этот атрибут не равен `None`, ответы, размер которых превышает это значение, будут закодированы с использованием кодировки передачи *gzip*, если это разрешено клиентом. По умолчанию `1400`, что примерно соответствует одному TCP-пакету.8081Новое в версии 2.7.8283### 20.24.1.1. Пример SimpleXMLRPCServer8485Код сервера:8687```python88from SimpleXMLRPCServer import SimpleXMLRPCServer89from SimpleXMLRPCServer import SimpleXMLRPCRequestHandler9091# Ограничить конкретным путём.92class RequestHandler(SimpleXMLRPCRequestHandler):93    rpc_paths = ('/RPC2',)9495# Создать сервер96server = SimpleXMLRPCServer(("localhost", 8000),97                            requestHandler=RequestHandler)98server.register_introspection_functions()99100# Зарегистрировать функцию pow(); будет использовано значение101# pow.__name__ как имя, то есть просто 'pow'.102server.register_function(pow)103104# Зарегистрировать функцию под другим именем105def adder_function(x,y):106    return x + y107server.register_function(adder_function, 'add')108109# Зарегистрировать экземпляр; все методы экземпляра110# опубликованы как методы XML-RPC (в данном случае просто 'div').111class MyFuncs:112    def div(self, x, y):113        return x // y114115server.register_instance(MyFuncs())116117# Запустить главный цикл сервера118server.serve_forever()119```120121Следующий клиентский код будет вызывать методы, предоставленные предыдущим сервером:122123```python124import xmlrpclib125126s = xmlrpclib.ServerProxy('http://localhost:8000')127print s.pow(2,3)  # Возвращает 2**3 = 8128print s.add(2,3)  # Возвращает 5129print s.div(5,2)  # Возвращает 5//2 = 2130131# Вывести список доступных методов132print s.system.listMethods()133```134135Следующий пример [`SimpleXMLRPCServer`](https://python-all.ru/2.7/library/simplexmlrpcserver.html#SimpleXMLRPCServer.SimpleXMLRPCServer) включён в модуль *Lib/SimpleXMLRPCServer.py*:136137```python138server = SimpleXMLRPCServer(("localhost", 8000))139server.register_function(pow)140server.register_function(lambda x,y: x+y, 'add')141server.register_multicall_functions()142server.serve_forever()143```144145Этот демонстрационный сервер можно запустить из командной строки:146147```python148python -m SimpleXMLRPCServer149```150151Пример клиентского кода, взаимодействующего с сервером выше, включён в *Lib/xmlrpclib.py*:152153```python154server = ServerProxy("http://localhost:8000")155print server156multi = MultiCall(server)157multi.pow(2, 9)158multi.add(5, 1)159multi.add(24, 11)160try:161    for response in multi():162        print response163except Error, v:164    print "ERROR", v165```166167А клиента можно вызвать напрямую с помощью следующей команды:168169```python170python -m xmlrpclib171```172173## 20.24.2. CGIXMLRPCRequestHandler174175Класс [`CGIXMLRPCRequestHandler`](https://python-all.ru/2.7/library/simplexmlrpcserver.html#SimpleXMLRPCServer.CGIXMLRPCRequestHandler) можно использовать для обработки XML-RPC запросов, отправленных CGI-скриптам Python.176177#### `CGIXMLRPCRequestHandler.register_function(function[, name])`178179Регистрирует функцию, которая может отвечать на запросы XML-RPC. Если указан *name*, он будет именем метода, ассоциированного с функцией, в противном случае будет использовано *function.\_\_name\_\_*. *name* может быть обычной или Unicode-строкой и может содержать символы, недопустимые в идентификаторах Python, включая точку.180181#### `CGIXMLRPCRequestHandler.register_instance(instance)`182183Регистрирует объект, который используется для предоставления имён методов, не зарегистрированных с помощью [`register_function()`](https://python-all.ru/2.7/library/simplexmlrpcserver.html#SimpleXMLRPCServer.CGIXMLRPCRequestHandler.register_function). Если экземпляр содержит метод `_dispatch()`, он вызывается с запрошенным именем метода и параметрами из запроса; возвращаемое значение передаётся клиенту как результат. Если экземпляр не имеет метода `_dispatch()`, выполняется поиск атрибута, соответствующего имени запрошенного метода; если имя запрошенного метода содержит точки, каждый компонент имени метода ищется отдельно, в результате чего выполняется простая иерархическая проверка. Найденное значение затем вызывается с параметрами из запроса, а возвращаемое значение передаётся обратно клиенту.184185#### `CGIXMLRPCRequestHandler.register_introspection_functions()`186187Регистрирует функции интроспекции XML-RPC `system.listMethods`, `system.methodHelp` и `system.methodSignature`.188189#### `CGIXMLRPCRequestHandler.register_multicall_functions()`190191Регистрирует функцию мультивызова XML-RPC `system.multicall`.192193#### `CGIXMLRPCRequestHandler.handle_request([request_text = None])`194195Обрабатывает XML-RPC запрос. Если задан *request\_text*, он должен содержать POST-данные, предоставленные HTTP-сервером, в противном случае будет использовано содержимое stdin.196197Пример:198199```python200class MyFuncs:201    def div(self, x, y): return x // y202203handler = CGIXMLRPCRequestHandler()204handler.register_function(pow)205handler.register_function(lambda x,y: x+y, 'add')206handler.register_introspection_functions()207handler.register_instance(MyFuncs())208handler.handle_request()209```210