xmlrpc.server — Базовые серверы XML-RPC
Исходный код: Lib/xmlrpc/server.py
Модуль xmlrpc.server предоставляет базовый серверный каркас для серверов XML-RPC, написанных на Python. Серверы могут быть самостоятельными, используя SimpleXMLRPCServer, или встраиваться в среду CGI, используя CGIXMLRPCRequestHandler.
Предупреждение
Модуль xmlrpc.server не защищён от злонамеренно сконструированных данных. Если вам нужно обработать недоверенные или неавторизованные данные, обратитесь к Уязвимостям XML.
Доступность: не Emscripten, не WASI.
Этот модуль не работает и не доступен на платформах WebAssembly wasm32-emscripten и wasm32-wasi. Для получения дополнительной информации см. Платформы WebAssembly.
-
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 истинно (по умолчанию), запросы будут регистрироваться; установка этого параметра в ложь отключит регистрирование. Параметры 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(), он вызывается с запрошенным именем метода и параметрами из запроса. Его APIdef _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 multicall.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, демонстрирует сервер, позволяющий использовать имена с точками и регистрирующий функцию multicall.
Предупреждение
Включение опции 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
Обработчик запросов CGIXMLRPC
Класс 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–2023 Python Software Foundation
Licensed under the PSF License.
https://docs.python.org/3.11/library/xmlrpc.server.html