xmlrpc.server — Базовые серверы XML-RPC
Исходный код: Lib/xmlrpc/server.py
Модуль xmlrpc.server предоставляет базовый серверный фреймворк для серверов XML-RPC, написанных на Python. Серверы могут быть автономными, используя SimpleXMLRPCServer, или встроенными в среду CGI, используя CGIXMLRPCRequestHandler.
Предупреждение
Модуль xmlrpc.server не защищен от данных, злонамеренно сконструированных. Если вам необходимо обработать недоверенные или неавторизованные данные, см. Уязвимости XML.
-
class xmlrpc.server.SimpleXMLRPCServer(addr, requestHandler=SimpleXMLRPCRequestHandler, logRequests=True, allow_none=False, encoding=None, bind_and_activate=True, use_builtin_types=False) -
Создает новый экземпляр сервера. Этот класс предоставляет методы для регистрации функций, которые могут вызываться по протоколу XML-RPC. Параметр requestHandler должен быть фабрикой для экземпляров обработчика запросов; по умолчанию он равен
SimpleXMLRPCRequestHandler. Параметры addr и requestHandler передаются конструкторуsocketserver.TCPServer. Если logRequests имеет значение true (по умолчанию), запросы будут регистрироваться; установка этого параметра в false отключит логирование. Параметры allow_none и encoding передаются вxmlrpc.clientи контролируют ответы XML-RPC, которые будут возвращены сервером. Параметр bind_and_activate управляет тем, вызываются лиserver_bind()иserver_activate()конструктором немедленно; по умолчанию он равен true. Установка его в false позволяет коду манипулировать переменной класса allow_reuse_address перед привязкой адреса. Параметр use_builtin_types передаётся функцииloads()и управляет типами, которые обрабатываются при получении значений дат/времени или двоичных данных; по умолчанию он равен false.Изменено в версии 3.3: Добавлен флаг use_builtin_types.
-
class xmlrpc.server.CGIXMLRPCRequestHandler(allow_none=False, encoding=None, use_builtin_types=False) -
Создает новый экземпляр для обработки запросов XML-RPC в среде CGI. Параметры allow_none и encoding передаются в
xmlrpc.clientи контролируют ответы XML-RPC, которые будут возвращены сервером. Параметр use_builtin_types передаётся функцииloads()и управляет типами, которые обрабатываются при получении значений дат/времени или двоичных данных; по умолчанию он равен false.Изменено в версии 3.3: Добавлен флаг use_builtin_types.
-
class xmlrpc.server.SimpleXMLRPCRequestHandler -
Создает новый экземпляр обработчика запросов. Этот обработчик поддерживает
POSTзапросы и изменяет логирование таким образом, чтобы параметр logRequests в конструктореSimpleXMLRPCServerсоблюдался.
Объекты SimpleXMLRPCServer
Класс SimpleXMLRPCServer основан на socketserver.TCPServer и предоставляет средство создания простых автономных серверов XML-RPC.
-
SimpleXMLRPCServer.register_function(function=None, name=None) -
Регистрирует функцию, которая может отвечать на запросы XML-RPC. Если задан name, он будет именем метода, связанным с function, в противном случае используется
function.__name__. name — строка и может содержать символы, не являющиеся допустимыми в идентификаторах Python, включая символ точки.Этот метод также может быть использован как декоратор. При использовании в качестве декоратора name может быть передан только в качестве ключевого аргумента для регистрации function под именем name. Если name не указан, используется
function.__name__.Изменено в версии 3.7:
register_function()может быть использован как декоратор.
-
SimpleXMLRPCServer.register_instance(instance, allow_dotted_names=False) -
Регистрирует объект, который используется для экспонирования имён методов, которые не были зарегистрированы с помощью
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').
Пример SimpleXMLRPCServer
Код сервера:
from xmlrpc.server import SimpleXMLRPCServer
from xmlrpc.server import SimpleXMLRPCRequestHandler
# Restrict to a particular path.
class RequestHandler(SimpleXMLRPCRequestHandler):
rpc_paths = ('/RPC2',)
# Create server
with SimpleXMLRPCServer(('localhost', 8000),
requestHandler=RequestHandler) as server:
server.register_introspection_functions()
# Register pow() function; this will use the value of
# pow.__name__ as the name, which is just 'pow'.
server.register_function(pow)
# Register a function under a different name
def adder_function(x, y):
return x + y
server.register_function(adder_function, 'add')
# Register an instance; all the methods of the instance are
# published as XML-RPC methods (in this case, just 'mul').
class MyFuncs:
def mul(self, x, y):
return x * y
server.register_instance(MyFuncs())
# Run the server's main loop
server.serve_forever()
Следующий код клиента вызовет методы, доступные предшествующим сервером:
import xmlrpc.client
s = xmlrpc.client.ServerProxy('http://localhost:8000')
print(s.pow(2,3)) # Returns 2**3 = 8
print(s.add(2,3)) # Returns 5
print(s.mul(5,2)) # Returns 5*2 = 10
# Print list of available methods
print(s.system.listMethods())
register_function() также может быть использован как декоратор. Предыдущий пример сервера может регистрировать функции в стиле декоратора:
from xmlrpc.server import SimpleXMLRPCServer
from xmlrpc.server import SimpleXMLRPCRequestHandler
class RequestHandler(SimpleXMLRPCRequestHandler):
rpc_paths = ('/RPC2',)
with SimpleXMLRPCServer(('localhost', 8000),
requestHandler=RequestHandler) as server:
server.register_introspection_functions()
# Register pow() function; this will use the value of
# pow.__name__ as the name, which is just 'pow'.
server.register_function(pow)
# Register a function under a different name, using
# register_function as a decorator. *name* can only be given
# as a keyword argument.
@server.register_function(name='add')
def adder_function(x, y):
return x + y
# Register a function under function.__name__.
@server.register_function
def mul(x, y):
return x * y
server.serve_forever()
Следующий пример, включённый в Lib/xmlrpc/server.py модуль, демонстрирует сервер, разрешающий имена с точками и регистрирующий функцию многократного вызова.
Предупреждение
Включение опции allow_dotted_names позволяет злоумышленникам получить доступ к глобальным переменным вашего модуля и может позволить злоумышленникам выполнить произвольный код на вашей машине. Используйте этот пример только в защищённой, закрытой сети.
import datetime
class ExampleService:
def getData(self):
return '42'
class currentTime:
@staticmethod
def getCurrentTime():
return datetime.datetime.now()
with SimpleXMLRPCServer(("localhost", 8000)) as server:
server.register_function(pow)
server.register_function(lambda x,y: x+y, 'add')
server.register_instance(ExampleService(), allow_dotted_names=True)
server.register_multicall_functions()
print('Serving XML-RPC on localhost port 8000')
try:
server.serve_forever()
except KeyboardInterrupt:
print("\nKeyboard interrupt received, exiting.")
sys.exit(0)
Этот пример демонстрации ExampleService может быть вызван из командной строки:
python -m xmlrpc.server
Клиент, взаимодействующий с вышеупомянутым сервером, включен в Lib/xmlrpc/client.py:
server = ServerProxy("http://localhost:8000")
try:
print(server.currentTime.getCurrentTime())
except Error as v:
print("ERROR", v)
multi = MultiCall(server)
multi.getData()
multi.pow(2,9)
multi.add(1,2)
try:
for response in multi():
print(response)
except Error as v:
print("ERROR", v)
Этот клиент, взаимодействующий с демонстрационным сервером XMLRPC, может быть вызван как:
python -m xmlrpc.client
CGIXMLRPCRequestHandler
Класс CGIXMLRPCRequestHandler может использоваться для обработки запросов XML-RPC, отправленных в скрипты Python CGI.
-
CGIXMLRPCRequestHandler.register_function(function=None, name=None) -
Регистрирует функцию, которая может отвечать на запросы XML-RPC. Если задан name, он будет именем метода, связанным с function, в противном случае используется
function.__name__. name — строка и может содержать символы, не являющиеся допустимыми в идентификаторах Python, включая символ точки.Этот метод также может быть использован как декоратор. При использовании в качестве декоратора name может быть передан только в качестве ключевого аргумента для регистрации function под именем name. Если name не указан, используется
function.__name__.Изменено в версии 3.7:
register_function()может быть использован как декоратор.
-
CGIXMLRPCRequestHandler.register_instance(instance) -
Зарегистрировать объект, используемый для экспонирования имён методов, которые не были зарегистрированы с помощью
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.
Пример:
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()
Документирование XMLRPC-сервера
Эти классы расширяют вышеуказанные классы для предоставления HTML-документации в ответ на запросы HTTP GET. Серверы могут быть автономными, используя DocXMLRPCServer, или встроенными в среду CGI, используя DocCGIXMLRPCRequestHandler.
-
class xmlrpc.server.DocXMLRPCServer(addr, requestHandler=DocXMLRPCRequestHandler, logRequests=True, allow_none=False, encoding=None, bind_and_activate=True, use_builtin_types=True) -
Создать новый экземпляр сервера. Все параметры имеют то же значение, что и для
SimpleXMLRPCServer; requestHandler по умолчанию равенDocXMLRPCRequestHandler.Изменено в версии 3.3: Флаг use_builtin_types был добавлен.
-
class xmlrpc.server.DocCGIXMLRPCRequestHandler -
Создать новый экземпляр для обработки запросов XML-RPC в среде CGI.
-
class xmlrpc.server.DocXMLRPCRequestHandler -
Создать новый экземпляр обработчика запросов. Этот обработчик запросов поддерживает запросы XML-RPC POST, запросы документации GET и изменяет ведение журнала таким образом, что параметр logRequests конструктора
DocXMLRPCServerучитывается.
Объекты DocXMLRPCServer
Класс DocXMLRPCServer наследуется от SimpleXMLRPCServer и предоставляет способ создания самодокументированных, автономных 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-документации. Это описание будет отображаться как абзац ниже имени сервера в документации.
DocCGIXMLRPCRequestHandler
Класс DocCGIXMLRPCRequestHandler наследуется от CGIXMLRPCRequestHandler и предоставляет способ создания самодокументированных скриптов 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-документации. Это описание будет отображаться как абзац ниже имени сервера в документации.
© 2001–2020 Python Software Foundation
Licensed under the PSF License.
https://docs.python.org/3.7/library/xmlrpc.server.html