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

xmlrpc.server.md

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

1> **Источник:** https://python-all.ru/3.2/library/xmlrpc.server.html2>3> «Документация Python на русском» – неофициальный перевод официальной документации Python: версии от 2.6 до 3.16, полнотекстовый поиск, английский оригинал рядом с переводом. Эта Markdown-версия страницы предназначена для работы с LLM: вставьте её в ChatGPT, Claude или Cursor.45---67# 20.24. [`xmlrpc.server`](https://python-all.ru/3.2/library/xmlrpc.server.html#module-xmlrpc.server) – Базовые XML-RPC серверы89**Исходный код:** [Lib/xmlrpc/server.py](https://python-all.ru/src/3.2/Lib/xmlrpc/server.py)1011---1213Модуль [`xmlrpc.server`](https://python-all.ru/3.2/library/xmlrpc.server.html#module-xmlrpc.server) предоставляет базовый серверный фреймворк для XML-RPC\\nсерверов, написанных на Python. Серверы могут быть как автономными, с использованием\\n[`SimpleXMLRPCServer`](https://python-all.ru/3.2/library/xmlrpc.server.html#xmlrpc.server.SimpleXMLRPCServer), так и встроенными в CGI-среду, с использованием\\n[`CGIXMLRPCRequestHandler`](https://python-all.ru/3.2/library/xmlrpc.server.html#xmlrpc.server.CGIXMLRPCRequestHandler).1415> **Предупреждение**16>17> Модуль [`xmlrpc.client`](https://python-all.ru/3.2/library/xmlrpc.client.html#module-xmlrpc.client) не защищён от вредоносных данных. Если необходимо анализировать непроверенные или неаутентифицированные данные, см. [*уязвимости XML*](https://python-all.ru/3.2/library/xml.html#xml-vulnerabilities).1819#### `class xmlrpc.server.SimpleXMLRPCServer(addr, requestHandler=SimpleXMLRPCRequestHandler, logRequests=True, allow_none=False, encoding=None, bind_and_activate=True)`2021Создаёт новый экземпляр сервера. Этот класс предоставляет методы для регистрации функций, которые могут быть вызваны по протоколу XML-RPC. Параметр *requestHandler* должен быть фабрикой для экземпляров обработчика запросов; по умолчанию используется [`SimpleXMLRPCRequestHandler`](https://python-all.ru/3.2/library/xmlrpc.server.html#xmlrpc.server.SimpleXMLRPCRequestHandler). Параметры *addr* и *requestHandler* передаются конструктору `socketserver.TCPServer`. Если *logRequests* равен true (по умолчанию), запросы будут логироваться; установка этого параметра в false отключит логирование. Параметры *allow\_none* и *encoding* передаются [`xmlrpc.client`](https://python-all.ru/3.2/library/xmlrpc.client.html#module-xmlrpc.client) и управляют XML-RPC ответами, которые будут возвращены сервером. Параметр *bind\_and\_activate* определяет, будут ли `server_bind()` и `server_activate()` вызваны сразу в конструкторе; по умолчанию true. Если установить false, это позволит коду изменить переменную класса *allow\_reuse\_address* до привязки адреса.2223#### `class xmlrpc.server.CGIXMLRPCRequestHandler(allow_none=False, encoding=None)`2425Создаёт новый экземпляр для обработки XML-RPC запросов в CGI-среде. Параметры *allow\_none* и *encoding* передаются [`xmlrpc.client`](https://python-all.ru/3.2/library/xmlrpc.client.html#module-xmlrpc.client) и управляют XML-RPC ответами, которые будут возвращены сервером.2627#### `class xmlrpc.server.SimpleXMLRPCRequestHandler`2829Создаёт новый экземпляр обработчика запросов. Этот обработчик поддерживает `POST` запросы и изменяет регистрацию (логирование) так, чтобы учитывался параметр *logRequests* конструктора [`SimpleXMLRPCServer`](https://python-all.ru/3.2/library/xmlrpc.server.html#xmlrpc.server.SimpleXMLRPCServer).3031## 20.24.1. Объекты SimpleXMLRPCServer3233Класс [`SimpleXMLRPCServer`](https://python-all.ru/3.2/library/xmlrpc.server.html#xmlrpc.server.SimpleXMLRPCServer) основан на `socketserver.TCPServer` и предоставляет способ создания простых автономных XML-RPC серверов.3435#### `SimpleXMLRPCServer.register_function(function, name=None)`3637Регистрирует функцию, которая может отвечать на XML-RPC запросы. Если задан *name*, то это будет имя метода, связанное с *function*; в противном случае будет использоваться `function.__name__`. *name* может быть как обычной, так и Unicode строкой, и может содержать символы, недопустимые в Python-идентификаторах, включая точку.3839#### `SimpleXMLRPCServer.register_instance(instance, allow_dotted_names=False)`4041Регистрирует объект, который используется для раскрытия имён методов, не зарегистрированных с помощью [`register_function()`](https://python-all.ru/3.2/library/xmlrpc.server.html#xmlrpc.server.SimpleXMLRPCServer.register_function). Если *instance* содержит метод `_dispatch()`, то он вызывается с именем запрошенного метода и параметрами из запроса. Его API: `def _dispatch(self, method, params)` (обратите внимание, что *params* не представляет собой список переменных аргументов). Если он вызывает некоторую базовую функцию для выполнения задачи, эта функция вызывается как `func(*params)`, с разворачиванием списка параметров. Возвращаемое значение из `_dispatch()` возвращается клиенту в качестве результата. Если *instance* не имеет метода `_dispatch()`, то в нём ищется атрибут, соответствующий имени запрошенного метода.4243Если необязательный аргумент *allow\_dotted\_names* равен true и экземпляр не имеет метода `_dispatch()`, то в случае, если имя запрошенного метода содержит точки, каждый компонент имени метода ищется отдельно, что приводит к выполнению простого иерархического поиска. Найденное значение затем вызывается с параметрами из запроса, а возвращаемое значение передаётся обратно клиенту.4445> **Предупреждение**46>47> Включение опции *allow\_dotted\_names* позволяет злоумышленникам получить доступ к глобальным переменным вашего модуля и может позволить им выполнить произвольный код на вашей машине. Используйте эту опцию только в безопасной закрытой сети.4849#### `SimpleXMLRPCServer.register_introspection_functions()`5051Регистрирует функции интроспекции XML-RPC: `system.listMethods`, `system.methodHelp` и `system.methodSignature`.5253#### `SimpleXMLRPCServer.register_multicall_functions()`5455Регистрирует функцию мультивызова XML-RPC system.multicall.5657#### `SimpleXMLRPCRequestHandler.rpc_paths`5859Значение атрибута, которое должно быть кортежем, перечисляющим допустимые части пути URL для приёма XML-RPC запросов. Запросы, отправленные на другие пути, приведут к HTTP-ошибке 404 «страница не найдена». Если этот кортеж пуст, все пути считаются допустимыми. Значение по умолчанию – `('/', '/RPC2')`.6061### 20.24.1.1. Пример SimpleXMLRPCServer6263Код сервера:6465```python66from xmlrpc.server import SimpleXMLRPCServer67from xmlrpc.server import SimpleXMLRPCRequestHandler6869# Ограничить конкретным путём.70class RequestHandler(SimpleXMLRPCRequestHandler):71    rpc_paths = ('/RPC2',)7273# Создать сервер74server = SimpleXMLRPCServer(("localhost", 8000),75                            requestHandler=RequestHandler)76server.register_introspection_functions()7778# Зарегистрировать функцию pow(); будет использовано значение79# pow.__name__ как имя, то есть просто 'pow'.80server.register_function(pow)8182# Зарегистрировать функцию под другим именем83def adder_function(x,y):84    return x + y85server.register_function(adder_function, 'add')8687# Зарегистрировать экземпляр; все методы экземпляра88# публикуются как XML-RPC-методы (в данном случае только 'mul').89class MyFuncs:90    def mul(self, x, y):91        return x * y9293server.register_instance(MyFuncs())9495# Запустить главный цикл сервера96server.serve_forever()97```9899Следующий клиентский код будет вызывать методы, предоставленные предыдущим сервером:100101```python102import xmlrpc.client103104s = xmlrpc.client.ServerProxy('http://localhost:8000')105print(s.pow(2,3))  # Возвращает 2**3 = 8106print(s.add(2,3))  # Возвращает 5107print(s.mul(5,2))  # Возвращает 5*2 = 10108109# Вывести список доступных методов110print(s.system.listMethods())111```112113## 20.24.2. CGIXMLRPCRequestHandler114115Класс [`CGIXMLRPCRequestHandler`](https://python-all.ru/3.2/library/xmlrpc.server.html#xmlrpc.server.CGIXMLRPCRequestHandler) может использоваться для обработки XML-RPC запросов, отправленных в CGI-сценарии Python.116117#### `CGIXMLRPCRequestHandler.register_function(function, name=None)`118119Регистрирует функцию, которая может отвечать на запросы XML-RPC. Если указан *name*, он будет именем метода, ассоциированного с функцией, в противном случае будет использовано *function.\_\_name\_\_*. *name* может быть обычной или Unicode-строкой и может содержать символы, недопустимые в идентификаторах Python, включая точку.120121#### `CGIXMLRPCRequestHandler.register_instance(instance)`122123Регистрирует объект, который используется для раскрытия имён методов, не зарегистрированных с помощью [`register_function()`](https://python-all.ru/3.2/library/xmlrpc.server.html#xmlrpc.server.CGIXMLRPCRequestHandler.register_function). Если экземпляр содержит метод `_dispatch()`, он вызывается с именем запрошенного метода и параметрами из запроса; возвращаемое значение возвращается клиенту в качестве результата. Если экземпляр не имеет метода `_dispatch()`, то в нём ищется атрибут, соответствующий имени запрошенного метода; если имя запрошенного метода содержит точки, каждый компонент имени метода ищется отдельно, что приводит к выполнению простого иерархического поиска. Найденное значение затем вызывается с параметрами из запроса, а возвращаемое значение передаётся обратно клиенту.124125#### `CGIXMLRPCRequestHandler.register_introspection_functions()`126127Регистрирует функции интроспекции XML-RPC: `system.listMethods`, `system.methodHelp` и `system.methodSignature`.128129#### `CGIXMLRPCRequestHandler.register_multicall_functions()`130131Регистрирует функцию мультивызова XML-RPC `system.multicall`.132133#### `CGIXMLRPCRequestHandler.handle_request(request_text=None)`134135Обрабатывает XML-RPC-запрос. Если передан *request\_text*, это должны быть POST-\\nданные, предоставленные HTTP-сервером; в противном случае используется содержимое stdin.136137Пример:138139```python140class MyFuncs:141    def mul(self, x, y):142        return x * y143144handler = CGIXMLRPCRequestHandler()145handler.register_function(pow)146handler.register_function(lambda x,y: x+y, 'add')147handler.register_introspection_functions()148handler.register_instance(MyFuncs())149handler.handle_request()150```151152## 20.24.3. Документирование XMLRPC сервера153154Эти классы расширяют приведённые выше классы для обслуживания HTML-документации в ответ\\nна HTTP GET-запросы. Серверы могут быть либо автономными, использующими\\n[`DocXMLRPCServer`](https://python-all.ru/3.2/library/xmlrpc.server.html#xmlrpc.server.DocXMLRPCServer), либо встроенными в CGI-среду, использующими\\n[`DocCGIXMLRPCRequestHandler`](https://python-all.ru/3.2/library/xmlrpc.server.html#xmlrpc.server.DocCGIXMLRPCRequestHandler).155156#### `class xmlrpc.server.DocXMLRPCServer(addr, requestHandler=DocXMLRPCRequestHandler, logRequests=True, allow_none=False, encoding=None, bind_and_activate=True)`157158Создаёт новый экземпляр сервера. Все параметры имеют то же значение, что и для\\n[`SimpleXMLRPCServer`](https://python-all.ru/3.2/library/xmlrpc.server.html#xmlrpc.server.SimpleXMLRPCServer); *requestHandler* по умолчанию равен\\n[`DocXMLRPCRequestHandler`](https://python-all.ru/3.2/library/xmlrpc.server.html#xmlrpc.server.DocXMLRPCRequestHandler).159160#### `class xmlrpc.server.DocCGIXMLRPCRequestHandler`161162Создаёт новый экземпляр для обработки XML-RPC запросов в CGI-среде.163164#### `class xmlrpc.server.DocXMLRPCRequestHandler`165166Создаёт новый экземпляр обработчика запросов. Этот обработчик поддерживает POST-запросы XML-RPC, GET-запросы документации и настраивает протоколирование так, чтобы значение параметра *logRequests* конструктора [`DocXMLRPCServer`](https://python-all.ru/3.2/library/xmlrpc.server.html#xmlrpc.server.DocXMLRPCServer) учитывалось.167168## 20.24.4. Объекты DocXMLRPCServer169170Класс [`DocXMLRPCServer`](https://python-all.ru/3.2/library/xmlrpc.server.html#xmlrpc.server.DocXMLRPCServer) является производным от [`SimpleXMLRPCServer`](https://python-all.ru/3.2/library/xmlrpc.server.html#xmlrpc.server.SimpleXMLRPCServer)\\nи предоставляет способ создания самодокументированных автономных XML-RPC-серверов. HTTP POST-запросы обрабатываются как вызовы методов XML-RPC. HTTP GET-запросы обрабатываются путём генерации HTML-документации в стиле pydoc. Это позволяет серверу предоставлять собственную веб-документацию.171172#### `DocXMLRPCServer.set_server_title(server_title)`173174Устанавливает заголовок, используемый в сгенерированной HTML-документации. Этот заголовок будет использоваться внутри элемента HTML «title».175176#### `DocXMLRPCServer.set_server_name(server_name)`177178Устанавливает имя, используемое в сгенерированной HTML-документации. Это имя будет отображаться в верхней части сгенерированной документации внутри элемента «h1».179180#### `DocXMLRPCServer.set_server_documentation(server_documentation)`181182Устанавливает описание, используемое в сгенерированной HTML-документации. Это описание будет отображаться в виде абзаца, под именем сервера, в документации.183184## 20.24.5. DocCGIXMLRPCRequestHandler185186Класс [`DocCGIXMLRPCRequestHandler`](https://python-all.ru/3.2/library/xmlrpc.server.html#xmlrpc.server.DocCGIXMLRPCRequestHandler) является производным от\\n[`CGIXMLRPCRequestHandler`](https://python-all.ru/3.2/library/xmlrpc.server.html#xmlrpc.server.CGIXMLRPCRequestHandler) и предоставляет способ создания\\nсамодокументированных XML-RPC CGI-скриптов. HTTP POST-запросы обрабатываются как вызовы методов XML-RPC. HTTP GET-запросы обрабатываются путём генерации HTML-документации в стиле pydoc. Это позволяет серверу предоставлять собственную веб-документацию.187188#### `DocCGIXMLRPCRequestHandler.set_server_title(server_title)`189190Устанавливает заголовок, используемый в сгенерированной HTML-документации. Этот заголовок будет использоваться внутри элемента HTML «title».191192#### `DocCGIXMLRPCRequestHandler.set_server_name(server_name)`193194Устанавливает имя, используемое в сгенерированной HTML-документации. Это имя будет отображаться в верхней части сгенерированной документации внутри элемента «h1».195196#### `DocCGIXMLRPCRequestHandler.set_server_documentation(server_documentation)`197198Устанавливает описание, используемое в сгенерированной HTML-документации. Это описание будет отображаться в виде абзаца, под именем сервера, в документации.199