> **Источник:** https://python-all.ru/3.1/library/xmlrpc.server.html
>
> «Документация Python на русском» – неофициальный перевод официальной документации Python: версии от 2.6 до 3.16, полнотекстовый поиск, английский оригинал рядом с переводом. Эта Markdown-версия страницы предназначена для работы с LLM: вставьте её в ChatGPT, Claude или Cursor.

---

# 20.24. `xmlrpc.server` – базовые XML-RPC серверы

Модуль `xmlrpc.server` предоставляет базовую серверную структуру для XML-RPC серверов, написанных на Python. Серверы могут быть как автономными (с использованием [`SimpleXMLRPCServer`](https://python-all.ru/3.1/library/xmlrpc.server.html#xmlrpc.server.SimpleXMLRPCServer)), так и встроенными в CGI-среду (с помощью [`CGIXMLRPCRequestHandler`](https://python-all.ru/3.1/library/xmlrpc.server.html#xmlrpc.server.CGIXMLRPCRequestHandler)).

#### `class xmlrpc.server.SimpleXMLRPCServer(addr, requestHandler=SimpleXMLRPCRequestHandler, logRequests=True, allow_none=False, encoding=None, bind_and_activate=True)`

Создаёт новый экземпляр сервера. Этот класс предоставляет методы для регистрации функций, которые могут быть вызваны по протоколу XML-RPC. Параметр

*requestHandler*

должен быть фабрикой для экземпляров обработчика запросов; по умолчанию используется

[`SimpleXMLRPCRequestHandler`](https://python-all.ru/3.1/library/xmlrpc.server.html#xmlrpc.server.SimpleXMLRPCRequestHandler)

. Параметры

*addr*

и

*requestHandler*

передаются конструктору

`socketserver.TCPServer`

. Если

*logRequests*

равен true (по умолчанию), запросы будут логироваться; установка этого параметра в false отключит логирование. Параметры

*allow\_none*

и

*encoding*

передаются

[`xmlrpc.client`](https://python-all.ru/3.1/library/xmlrpc.client.html#module-xmlrpc.client)

и управляют XML-RPC ответами, которые будут возвращены сервером. Параметр

*bind\_and\_activate*

определяет, будут ли

`server_bind()`

и

`server_activate()`

вызваны сразу в конструкторе; по умолчанию true. Если установить false, это позволит коду изменить переменную класса

*allow\_reuse\_address*

до привязки адреса.

#### `class xmlrpc.server.CGIXMLRPCRequestHandler(allow_none=False, encoding=None)`

Создаёт новый экземпляр для обработки XML-RPC запросов в CGI-среде. Параметры

*allow\_none*

и

*encoding*

передаются

[`xmlrpc.client`](https://python-all.ru/3.1/library/xmlrpc.client.html#module-xmlrpc.client)

и управляют XML-RPC ответами, которые будут возвращены сервером.

#### `class xmlrpc.server.SimpleXMLRPCRequestHandler`

Создаёт новый экземпляр обработчика запросов. Этот обработчик поддерживает

`POST`

запросы и изменяет регистрацию (логирование) так, чтобы учитывался параметр

*logRequests*

конструктора

[`SimpleXMLRPCServer`](https://python-all.ru/3.1/library/xmlrpc.server.html#xmlrpc.server.SimpleXMLRPCServer)

.

## 20.24.1. Объекты SimpleXMLRPCServer

Класс [`SimpleXMLRPCServer`](https://python-all.ru/3.1/library/xmlrpc.server.html#xmlrpc.server.SimpleXMLRPCServer) основан на `socketserver.TCPServer` и предоставляет способ создания простых автономных XML-RPC серверов.

#### `SimpleXMLRPCServer.register_function(function, name=None)`

Регистрирует функцию, которая может отвечать на XML-RPC запросы. Если задан

*name*

, то это будет имя метода, связанное с

*function*

; в противном случае будет использоваться

`function.__name__`

.

*name*

может быть как обычной, так и Unicode строкой, и может содержать символы, недопустимые в Python-идентификаторах, включая точку.

#### `SimpleXMLRPCServer.register_instance(instance, allow_dotted_names=False)`

Регистрирует объект, который используется для раскрытия имён методов, не зарегистрированных с помощью [`register_function()`](https://python-all.ru/3.1/library/xmlrpc.server.html#xmlrpc.server.SimpleXMLRPCServer.register_function). Если *instance* содержит метод `_dispatch()`, то он вызывается с именем запрошенного метода и параметрами из запроса. Его API: `def _dispatch(self, method, params)` (обратите внимание, что *params* не представляет собой список переменных аргументов). Если он вызывает некоторую базовую функцию для выполнения задачи, эта функция вызывается как `func(*params)`, с разворачиванием списка параметров. Возвращаемое значение из `_dispatch()` возвращается клиенту в качестве результата. Если *instance* не имеет метода `_dispatch()`, то в нём ищется атрибут, соответствующий имени запрошенного метода.

Если необязательный аргумент *allow\_dotted\_names* равен true и экземпляр не имеет метода `_dispatch()`, то в случае, если имя запрошенного метода содержит точки, каждый компонент имени метода ищется отдельно, что приводит к выполнению простого иерархического поиска. Найденное значение затем вызывается с параметрами из запроса, а возвращаемое значение передаётся обратно клиенту.

> **Предупреждение**
>
> Включение опции *allow\_dotted\_names* позволяет злоумышленникам получить доступ к глобальным переменным вашего модуля и может позволить им выполнить произвольный код на вашей машине. Используйте эту опцию только в безопасной закрытой сети.

#### `SimpleXMLRPCServer.register_introspection_functions()`

Регистрирует функции интроспекции XML-RPC:

`system.listMethods`

,

`system.methodHelp`

и

`system.methodSignature`

.

#### `SimpleXMLRPCServer.register_multicall_functions()`

Регистрирует функцию мультивызова XML-RPC system.multicall.

#### `SimpleXMLRPCRequestHandler.rpc_paths`

Значение атрибута, которое должно быть кортежем, перечисляющим допустимые части пути URL для приёма XML-RPC запросов. Запросы, отправленные на другие пути, приведут к HTTP-ошибке 404 «страница не найдена». Если этот кортеж пуст, все пути считаются допустимыми. Значение по умолчанию –

`('/', '/RPC2')`

.

### 20.24.1.1. Пример SimpleXMLRPCServer

Код сервера:

```python
from xmlrpc.server import SimpleXMLRPCServer
from xmlrpc.server import SimpleXMLRPCRequestHandler

# Ограничить конкретным путём.
class RequestHandler(SimpleXMLRPCRequestHandler):
    rpc_paths = ('/RPC2',)

# Создать сервер
server = SimpleXMLRPCServer(("localhost", 8000),
                            requestHandler=RequestHandler)
server.register_introspection_functions()

# Зарегистрировать функцию pow(); будет использовано значение
# pow.__name__ как имя, то есть просто 'pow'.
server.register_function(pow)

# Зарегистрировать функцию под другим именем
def adder_function(x,y):
    return x + y
server.register_function(adder_function, 'add')

# Зарегистрировать экземпляр; все методы экземпляра
# публикуются как XML-RPC-методы (в данном случае только 'mul').
class MyFuncs:
    def mul(self, x, y):
        return x * y

server.register_instance(MyFuncs())

# Запустить главный цикл сервера
server.serve_forever()
```

Следующий клиентский код будет вызывать методы, предоставленные предыдущим сервером:

```python
import xmlrpc.client

s = xmlrpc.client.ServerProxy('http://localhost:8000')
print(s.pow(2,3))  # Возвращает 2**3 = 8
print(s.add(2,3))  # Возвращает 5
print(s.mul(5,2))  # Возвращает 5*2 = 10

# Вывести список доступных методов
print(s.system.listMethods())
```

## 20.24.2. CGIXMLRPCRequestHandler

Класс [`CGIXMLRPCRequestHandler`](https://python-all.ru/3.1/library/xmlrpc.server.html#xmlrpc.server.CGIXMLRPCRequestHandler) может использоваться для обработки XML-RPC запросов, отправленных в CGI-сценарии Python.

#### `CGIXMLRPCRequestHandler.register_function(function, name=None)`

Регистрирует функцию, которая может отвечать на запросы XML-RPC. Если указан

*name*

, он будет именем метода, ассоциированного с функцией, в противном случае будет использовано

*function.\_\_name\_\_*

.

*name*

может быть обычной или Unicode-строкой и может содержать символы, недопустимые в идентификаторах Python, включая точку.

#### `CGIXMLRPCRequestHandler.register_instance(instance)`

Регистрирует объект, который используется для раскрытия имён методов, не зарегистрированных с помощью

[`register_function()`](https://python-all.ru/3.1/library/xmlrpc.server.html#xmlrpc.server.CGIXMLRPCRequestHandler.register_function)

. Если экземпляр содержит метод

`_dispatch()`

, он вызывается с именем запрошенного метода и параметрами из запроса; возвращаемое значение возвращается клиенту в качестве результата. Если экземпляр не имеет метода

`_dispatch()`

, то в нём ищется атрибут, соответствующий имени запрошенного метода; если имя запрошенного метода содержит точки, каждый компонент имени метода ищется отдельно, что приводит к выполнению простого иерархического поиска. Найденное значение затем вызывается с параметрами из запроса, а возвращаемое значение передаётся обратно клиенту.

#### `CGIXMLRPCRequestHandler.register_introspection_functions()`

Регистрирует функции интроспекции XML-RPC:

`system.listMethods`

,

`system.methodHelp`

и

`system.methodSignature`

.

#### `CGIXMLRPCRequestHandler.register_multicall_functions()`

Регистрирует функцию мультивызова XML-RPC

`system.multicall`

.

#### `CGIXMLRPCRequestHandler.handle_request(request_text=None)`

Обрабатывает XML-RPC-запрос. Если передан

*request\_text*

, это должны быть POST-\\nданные, предоставленные HTTP-сервером; в противном случае используется содержимое stdin.

Пример:

```python
class MyFuncs:
    def mul(self, x, y):
        return x * y

handler = CGIXMLRPCRequestHandler()
handler.register_function(pow)
handler.register_function(lambda x,y: x+y, 'add')
handler.register_introspection_functions()
handler.register_instance(MyFuncs())
handler.handle_request()
```

## 20.24.3. Документирование XMLRPC сервера

Эти классы расширяют приведённые выше классы для обслуживания HTML-документации в ответ\\nна HTTP GET-запросы. Серверы могут быть либо автономными, использующими\\n[`DocXMLRPCServer`](https://python-all.ru/3.1/library/xmlrpc.server.html#xmlrpc.server.DocXMLRPCServer), либо встроенными в CGI-среду, использующими\\n[`DocCGIXMLRPCRequestHandler`](https://python-all.ru/3.1/library/xmlrpc.server.html#xmlrpc.server.DocCGIXMLRPCRequestHandler).

#### `class xmlrpc.server.DocXMLRPCServer(addr, requestHandler=DocXMLRPCRequestHandler, logRequests=True, allow_none=False, encoding=None, bind_and_activate=True)`

Создаёт новый экземпляр сервера. Все параметры имеют то же значение, что и для\\n

[`SimpleXMLRPCServer`](https://python-all.ru/3.1/library/xmlrpc.server.html#xmlrpc.server.SimpleXMLRPCServer)

;

*requestHandler*

по умолчанию равен\\n

[`DocXMLRPCRequestHandler`](https://python-all.ru/3.1/library/xmlrpc.server.html#xmlrpc.server.DocXMLRPCRequestHandler)

.

#### `class xmlrpc.server.DocCGIXMLRPCRequestHandler`

Создаёт новый экземпляр для обработки XML-RPC запросов в CGI-среде.

#### `class xmlrpc.server.DocXMLRPCRequestHandler`

Создаёт новый экземпляр обработчика запросов. Этот обработчик поддерживает POST-запросы XML-RPC, GET-запросы документации и настраивает протоколирование так, чтобы значение параметра

*logRequests*

конструктора

[`DocXMLRPCServer`](https://python-all.ru/3.1/library/xmlrpc.server.html#xmlrpc.server.DocXMLRPCServer)

учитывалось.

## 20.24.4. Объекты DocXMLRPCServer

Класс [`DocXMLRPCServer`](https://python-all.ru/3.1/library/xmlrpc.server.html#xmlrpc.server.DocXMLRPCServer) является производным от [`SimpleXMLRPCServer`](https://python-all.ru/3.1/library/xmlrpc.server.html#xmlrpc.server.SimpleXMLRPCServer)\\nи предоставляет способ создания самодокументированных автономных XML-RPC-серверов. HTTP POST-запросы обрабатываются как вызовы методов XML-RPC. HTTP GET-запросы обрабатываются путём генерации HTML-документации в стиле pydoc. Это позволяет серверу предоставлять собственную веб-документацию.

#### `DocXMLRPCServer.set_server_title(server_title)`

Устанавливает заголовок, используемый в сгенерированной HTML-документации. Этот заголовок будет использоваться внутри элемента HTML «title».

#### `DocXMLRPCServer.set_server_name(server_name)`

Устанавливает имя, используемое в сгенерированной HTML-документации. Это имя будет отображаться в верхней части сгенерированной документации внутри элемента «h1».

#### `DocXMLRPCServer.set_server_documentation(server_documentation)`

Устанавливает описание, используемое в сгенерированной HTML-документации. Это описание будет отображаться в виде абзаца, под именем сервера, в документации.

## 20.24.5. DocCGIXMLRPCRequestHandler

Класс [`DocCGIXMLRPCRequestHandler`](https://python-all.ru/3.1/library/xmlrpc.server.html#xmlrpc.server.DocCGIXMLRPCRequestHandler) является производным от\\n[`CGIXMLRPCRequestHandler`](https://python-all.ru/3.1/library/xmlrpc.server.html#xmlrpc.server.CGIXMLRPCRequestHandler) и предоставляет способ создания\\nсамодокументированных XML-RPC CGI-скриптов. HTTP POST-запросы обрабатываются как вызовы методов XML-RPC. HTTP GET-запросы обрабатываются путём генерации HTML-документации в стиле pydoc. Это позволяет серверу предоставлять собственную веб-документацию.

#### `DocCGIXMLRPCRequestHandler.set_server_title(server_title)`

Устанавливает заголовок, используемый в сгенерированной HTML-документации. Этот заголовок будет использоваться внутри элемента HTML «title».

#### `DocCGIXMLRPCRequestHandler.set_server_name(server_name)`

Устанавливает имя, используемое в сгенерированной HTML-документации. Это имя будет отображаться в верхней части сгенерированной документации внутри элемента «h1».

#### `DocCGIXMLRPCRequestHandler.set_server_documentation(server_documentation)`

Устанавливает описание, используемое в сгенерированной HTML-документации. Это описание будет отображаться в виде абзаца, под именем сервера, в документации.
