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

---

# 20.24. [`SimpleXMLRPCServer`](https://python-all.ru/2.7/library/simplexmlrpcserver.html#module-SimpleXMLRPCServer) – Базовый XML-RPC сервер

> **Примечание**
>
> Модуль [`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.

Новое в версии 2.2.

**Исходный код:** [Lib/SimpleXMLRPCServer.py](https://python-all.ru/src/2.7/Lib/SimpleXMLRPCServer.py)

---

Модуль [`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).

#### `class SimpleXMLRPCServer.SimpleXMLRPCServer(addr[, requestHandler[, logRequests[, allow_none[, encoding[, bind_and_activate]]]])`

Создаёт новый экземпляр сервера. Этот класс предоставляет методы для регистрации функций, которые могут быть вызваны протоколом 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* до привязки адреса.

Изменено в версии 2.5: Добавлены параметры *allow\_none* и *encoding*.

Изменено в версии 2.6: Добавлен параметр *bind\_and\_activate*.

#### `class SimpleXMLRPCServer.CGIXMLRPCRequestHandler([allow_none[, encoding]])`

Создаёт новый экземпляр для обработки XML-RPC запросов в CGI-среде. Параметры *allow\_none* и *encoding* передаются в [`xmlrpclib`](https://python-all.ru/2.7/library/xmlrpclib.html#module-xmlrpclib) и управляют XML-RPC ответами, возвращаемыми сервером.

Новое в версии 2.3.

Изменено в версии 2.5: Добавлены параметры *allow\_none* и *encoding*.

#### `class SimpleXMLRPCServer.SimpleXMLRPCRequestHandler`

Создаёт новый экземпляр обработчика запросов. Этот обработчик поддерживает запросы `POST` и изменяет логирование так, чтобы параметр *logRequests* конструктора [`SimpleXMLRPCServer`](https://python-all.ru/2.7/library/simplexmlrpcserver.html#SimpleXMLRPCServer.SimpleXMLRPCServer) учитывался.

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

Класс [`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 серверов.

#### `SimpleXMLRPCServer.register_function(function[, name])`

Регистрирует функцию, которая может отвечать на запросы XML-RPC. Если указан *name*, он будет именем метода, ассоциированного с *function*, в противном случае будет использовано `function.__name__`. *name* может быть обычной или Unicode-строкой и может содержать символы, недопустимые в идентификаторах Python, включая точку.

#### `SimpleXMLRPCServer.register_instance(instance[, allow_dotted_names])`

Регистрирует объект, который используется для предоставления доступа к именам методов, не зарегистрированных с помощью [`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()`, в нём ищется атрибут, соответствующий имени запрошенного метода.

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

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

Изменено в версиях 2.3.5 и 2.4.1: Добавлен параметр *allow\_dotted\_names* для закрытия дыры в безопасности; предыдущие версии небезопасны.

#### `SimpleXMLRPCServer.register_introspection_functions()`

Регистрирует функции интроспекции XML-RPC: `system.listMethods`, `system.methodHelp` и `system.methodSignature`.

Новое в версии 2.3.

#### `SimpleXMLRPCServer.register_multicall_functions()`

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

#### `SimpleXMLRPCRequestHandler.rpc_paths`

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

Новое в версии 2.5.

#### `SimpleXMLRPCRequestHandler.encode_threshold`

Если этот атрибут не равен `None`, ответы, размер которых превышает это значение, будут закодированы с использованием кодировки передачи *gzip*, если это разрешено клиентом. По умолчанию `1400`, что примерно соответствует одному TCP-пакету.

Новое в версии 2.7.

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

Код сервера:

```python
from SimpleXMLRPCServer import SimpleXMLRPCServer
from SimpleXMLRPCServer 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 (в данном случае просто 'div').
class MyFuncs:
    def div(self, x, y):
        return x // y

server.register_instance(MyFuncs())

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

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

```python
import xmlrpclib

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

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

Следующий пример [`SimpleXMLRPCServer`](https://python-all.ru/2.7/library/simplexmlrpcserver.html#SimpleXMLRPCServer.SimpleXMLRPCServer) включён в модуль *Lib/SimpleXMLRPCServer.py*:

```python
server = SimpleXMLRPCServer(("localhost", 8000))
server.register_function(pow)
server.register_function(lambda x,y: x+y, 'add')
server.register_multicall_functions()
server.serve_forever()
```

Этот демонстрационный сервер можно запустить из командной строки:

```python
python -m SimpleXMLRPCServer
```

Пример клиентского кода, взаимодействующего с сервером выше, включён в *Lib/xmlrpclib.py*:

```python
server = ServerProxy("http://localhost:8000")
print server
multi = MultiCall(server)
multi.pow(2, 9)
multi.add(5, 1)
multi.add(24, 11)
try:
    for response in multi():
        print response
except Error, v:
    print "ERROR", v
```

А клиента можно вызвать напрямую с помощью следующей команды:

```python
python -m xmlrpclib
```

## 20.24.2. CGIXMLRPCRequestHandler

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

#### `CGIXMLRPCRequestHandler.register_function(function[, name])`

Регистрирует функцию, которая может отвечать на запросы XML-RPC. Если указан *name*, он будет именем метода, ассоциированного с функцией, в противном случае будет использовано *function.\_\_name\_\_*. *name* может быть обычной или Unicode-строкой и может содержать символы, недопустимые в идентификаторах Python, включая точку.

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

Регистрирует объект, который используется для предоставления имён методов, не зарегистрированных с помощью [`register_function()`](https://python-all.ru/2.7/library/simplexmlrpcserver.html#SimpleXMLRPCServer.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-данные, предоставленные HTTP-сервером, в противном случае будет использовано содержимое stdin.

Пример:

```python
class MyFuncs:
    def div(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()
```
