xmlrpc.server
--- 基本 XML-RPC 服務(wù)器?
源代碼: Lib/xmlrpc/server.py
xmlrpc.server
模塊為以 Python 編寫 XML-RPC 服務(wù)器提供了一個(gè)基本服務(wù)器框架。 服務(wù)器可以是獨(dú)立的,使用 SimpleXMLRPCServer
,或是嵌入某個(gè) CGI 環(huán)境中,使用 CGIXMLRPCRequestHandler
。
警告
xmlrpc.server
模塊對于惡意構(gòu)建的數(shù)據(jù)是不安全的。 如果你需要解析不受信任或未經(jīng)身份驗(yàn)證的數(shù)據(jù),請參閱 XML 漏洞。
- class xmlrpc.server.SimpleXMLRPCServer(addr, requestHandler=SimpleXMLRPCRequestHandler, logRequests=True, allow_none=False, encoding=None, bind_and_activate=True, use_builtin_types=False)?
創(chuàng)建一個(gè)新的服務(wù)器實(shí)例。 這個(gè)類提供了一些用來注冊可以被 XML-RPC 協(xié)議所調(diào)用的函數(shù)的方法。 requestHandler 形參應(yīng)該是一個(gè)用于請求處理句柄實(shí)例的工廠函數(shù);它默認(rèn)為
SimpleXMLRPCRequestHandler
。 addr 和 requestHandler 形參會(huì)被傳給socketserver.TCPServer
構(gòu)造器。 如果 logRequests 為真值(默認(rèn)),請求將被記錄到日志;將此形參設(shè)為假值將關(guān)閉日志記錄。 allow_none 和 encoding 形參會(huì)被傳給xmlrpc.client
并控制將從服務(wù)器返回的 XML-RPC 響應(yīng)。 bind_and_activate 形參控制server_bind()
和server_activate()
是否會(huì)被構(gòu)造器立即調(diào)用;它默認(rèn)為真值。 將其設(shè)為假值將允許代碼在地址被綁定之前操作 allow_reuse_address 類變量。 use_builtin_types 形參會(huì)被傳給loads()
函數(shù)并控制當(dāng)收到日期/時(shí)間值或二進(jìn)制數(shù)據(jù)時(shí)將處理哪些類型;它默認(rèn)為假值。在 3.3 版更改: 增加了 use_builtin_types 旗標(biāo)。
- class xmlrpc.server.CGIXMLRPCRequestHandler(allow_none=False, encoding=None, use_builtin_types=False)?
創(chuàng)建一個(gè)新的實(shí)例來處理 CGI 環(huán)境中的 XML-RPC 請求。 allow_none 和 encoding 形參會(huì)被傳遞給
xmlrpc.client
并控制將要從服務(wù)器返回的 XML-RPC 響應(yīng)。 use_builtin_types 形參會(huì)被傳遞給loads()
函數(shù)并控制當(dāng)接收到日期/時(shí)間值或二進(jìn)制數(shù)據(jù)時(shí)要處理哪種類型;該形參默認(rèn)為假值。在 3.3 版更改: 增加了 use_builtin_types 旗標(biāo)。
- class xmlrpc.server.SimpleXMLRPCRequestHandler?
創(chuàng)建一個(gè)新的請求處理句柄實(shí)例。 該請求處理句柄支持
POST
請求并會(huì)修改日志記錄操作以便使用傳遞給SimpleXMLRPCServer
構(gòu)造器形參的 logRequests 形參。
SimpleXMLRPCServer 對象?
SimpleXMLRPCServer
類是基于 socketserver.TCPServer
并提供了一個(gè)創(chuàng)建簡單、獨(dú)立的 XML-RPC 服務(wù)器的方式。
- SimpleXMLRPCServer.register_function(function=None, name=None)?
注冊一個(gè)可以響應(yīng) XML-RPC 請求的函數(shù)。 如果給出了 name,則它將成為與 function 相關(guān)聯(lián)的方法名,否則將使用
function.__name__
。 name 是一個(gè)字符串,并可能包含不可在 Python 標(biāo)識符中出現(xiàn)的字符,包括句點(diǎn)符。此方法也可被用作裝飾器。 當(dāng)被用作裝飾器時(shí),name 只能被指定為以 name 注冊的 function 的一個(gè)關(guān)鍵字參數(shù)。 如果沒有指定 name,則將使用
function.__name__
。在 3.7 版更改:
register_function()
可被用作裝飾器。
- SimpleXMLRPCServer.register_instance(instance, allow_dotted_names=False)?
注冊一個(gè)被用來公開未使用
register_function()
注冊的方法名的對象。 如果 instance 包含_dispatch()
方法,它將被調(diào)用并附帶被請求的方法名和來自請求的形參。 它的 API 是def _dispatch(self, method, params)
(請注意 params 并不表示變量參數(shù)列表)。 如果它調(diào)用了一個(gè)下層函數(shù)來執(zhí)行任務(wù),該函數(shù)將以func(*params)
的形式被調(diào)用,即擴(kuò)展了形參列表。 來自_dispatch()
的返回值將作為結(jié)果被返回給客戶端。 如果 instance 不包含_dispatch()
方法,則會(huì)在其中搜索與被請求的方法名相匹配的屬性。如果可選的 allow_dotted_names 參數(shù)為真值且該實(shí)例沒有
_dispatch()
方法,則如果被請求的方法名包含句點(diǎn)符,會(huì)單獨(dú)搜索該方法名的每個(gè)組成部分,其效果就是執(zhí)行了簡單的分層級搜索。 通過搜索找到的值將隨即附帶來自請求的形參被調(diào)用,并且返回值會(huì)被回傳給客戶端。警告
啟用 allow_dotted_names 選項(xiàng)將允許入侵者訪問你的模塊的全局變量并可能允許入侵者在你的機(jī)器上執(zhí)行任意代碼。 僅可在安全、封閉的網(wǎng)絡(luò)中使用此選項(xiàng)。
- SimpleXMLRPCServer.register_introspection_functions()?
注冊 XML-RPC 內(nèi)省函數(shù)
system.listMethods
,system.methodHelp
和system.methodSignature
。
- SimpleXMLRPCServer.register_multicall_functions()?
注冊 XML-RPC 多調(diào)用函數(shù) system.multicall。
- SimpleXMLRPCRequestHandler.rpc_paths?
一個(gè)必須為元組類型的屬性值,其中列出所接收 XML-RPC 請求的有效路徑部分。 發(fā)送到其他路徑的請求將導(dǎo)致 404 "no such page" HTTP 錯(cuò)誤。 如果此元組為空,則所有路徑都將被視為有效。 默認(rèn)值為
('/', '/RPC2')
。
SimpleXMLRPCServer 示例?
服務(wù)器端代碼:
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()
以下客戶端代碼將調(diào)用上述服務(wù)器所提供的方法:
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()
也可被用作裝飾器。 上述服務(wù)器端示例可以通過裝飾器方式來注冊函數(shù):
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
模塊中的例子演示了一個(gè)允許帶點(diǎn)號名稱并注冊有多調(diào)用函數(shù)的服務(wù)器。
警告
啟用 allow_dotted_names 選項(xiàng)將允許入侵者訪問你的模塊的全局變量并可能允許入侵者在你的機(jī)器上執(zhí)行任意代碼。 僅可在安全、封閉的網(wǎng)絡(luò)中使用此示例。
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)
這個(gè) ExampleService 演示程序可通過命令行發(fā)起調(diào)用:
python -m xmlrpc.server
可與上述服務(wù)器進(jìn)行交互的客戶端包括在 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)
這個(gè)可與示例 XMLRPC 服務(wù)器進(jìn)行交互的客戶端的啟動(dòng)方式如下:
python -m xmlrpc.client
CGIXMLRPCRequestHandler?
CGIXMLRPCRequestHandler
類可被用來處理發(fā)送給 Python CGI 腳本的 XML-RPC 請求。
- CGIXMLRPCRequestHandler.register_function(function=None, name=None)?
注冊一個(gè)可以響應(yīng) XML-RPC 請求的函數(shù)。 如果給出了 name,則它將成為與 function 相關(guān)聯(lián)的方法名,否則將使用
function.__name__
。 name 是一個(gè)字符串,并可能包含不可在 Python 標(biāo)識符中出現(xiàn)的字符,包括句點(diǎn)符。此方法也可被用作裝飾器。 當(dāng)被用作裝飾器時(shí),name 只能被指定為以 name 注冊的 function 的一個(gè)關(guān)鍵字參數(shù)。 如果沒有指定 name,則將使用
function.__name__
。在 3.7 版更改:
register_function()
可被用作裝飾器。
- CGIXMLRPCRequestHandler.register_instance(instance)?
注冊一個(gè)對象用來公開未使用
register_function()
進(jìn)行注冊的方法名。 如果實(shí)例包含_dispatch()
方法,它會(huì)附帶所請求的方法名和來自請求的形參被調(diào)用;返回值會(huì)作為結(jié)果被返回給客戶端。 如果實(shí)例不包含_dispatch()
方法,則在其中搜索與所請求方法名相匹配的屬性;如果所請求方法名包含句點(diǎn),則會(huì)分別搜索方法名的每個(gè)部分,其效果就是執(zhí)行了簡單的層級搜索。 搜索找到的值將附帶來自請求的形參被調(diào)用,其返回值會(huì)被返回給客戶端。
- CGIXMLRPCRequestHandler.register_introspection_functions()?
注冊 XML-RPC 內(nèi)海函數(shù)
system.listMethods
,system.methodHelp
和system.methodSignature
。
- CGIXMLRPCRequestHandler.register_multicall_functions()?
注冊 XML-RPC 多調(diào)用函數(shù)
system.multicall
。
- CGIXMLRPCRequestHandler.handle_request(request_text=None)?
處理一個(gè) XML-RPC 請求。 如果給出了 request_text,它應(yīng)當(dāng)是 HTTP 服務(wù)器所提供的 POST 數(shù)據(jù),否則將使用 stdin 的內(nèi)容。
示例:
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 服務(wù)器?
這些類擴(kuò)展了上面的類以發(fā)布響應(yīng) HTTP GET 請求的 HTML 文檔。 服務(wù)器可以是獨(dú)立的,使用 DocXMLRPCServer
,或是嵌入某個(gè) CGI 環(huán)境中,使用 DocCGIXMLRPCRequestHandler
。
- class xmlrpc.server.DocXMLRPCServer(addr, requestHandler=DocXMLRPCRequestHandler, logRequests=True, allow_none=False, encoding=None, bind_and_activate=True, use_builtin_types=True)?
創(chuàng)建一個(gè)新的服務(wù)器實(shí)例。 所有形參的含義與
SimpleXMLRPCServer
的相同;requestHandler 默認(rèn)為DocXMLRPCRequestHandler
。在 3.3 版更改: 增加了 use_builtin_types 旗標(biāo)。
- class xmlrpc.server.DocCGIXMLRPCRequestHandler?
創(chuàng)建一個(gè)新的實(shí)例來處理 CGI 環(huán)境中的 XML-RPC 請求。
- class xmlrpc.server.DocXMLRPCRequestHandler?
創(chuàng)建一個(gè)新的請求處理句柄實(shí)例。 該請求處理句柄支持 XML-RPC POST 請求、文檔 GET 請求并會(huì)修改日志記錄操作以便使用傳遞給
DocXMLRPCServer
構(gòu)造器形參的 logRequests 形參。
DocXMLRPCServer 對象?
DocXMLRPCServer
類派生自 SimpleXMLRPCServer
并提供了一種創(chuàng)建自動(dòng)記錄文檔的、獨(dú)立的 XML-RPC 服務(wù)器的方式。 HTTP POST 請求將作為 XML-RPC 方法調(diào)用來處理。 HTTP GET 請求將通過生成 pydoc 風(fēng)格的 HTML 文檔來處理。 這將允許服務(wù)器自己提供基于 Web 的文檔。
- DocXMLRPCServer.set_server_title(server_title)?
設(shè)置所生成 HTML 文檔要使用的標(biāo)題。 此標(biāo)題將在 HTML "title" 元素中使用。
- DocXMLRPCServer.set_server_name(server_name)?
設(shè)置所生成 HTML 文檔要使用的名稱。 此名稱將出現(xiàn)在所生成文檔頂部的 "h1" 元素中。
- DocXMLRPCServer.set_server_documentation(server_documentation)?
設(shè)置所生成Set the description used in the generated HTML 文檔要使用的描述。 此描述將顯示為文檔中的一個(gè)段落,位于服務(wù)器名稱之下。
DocCGIXMLRPCRequestHandler?
DocCGIXMLRPCRequestHandler
類派生自 CGIXMLRPCRequestHandler
并提供了一種創(chuàng)建自動(dòng)記錄文檔的 XML-RPC CGI 腳本的方式。 HTTP POST 請求將作為 XML-RPC 方法調(diào)用來處理。 HTTP GET 請求將通過生成 pydoc 風(fēng)格的 HTML 文檔來處理。 這將允許服務(wù)器自己提供基于 Web 的文檔。
- DocCGIXMLRPCRequestHandler.set_server_title(server_title)?
設(shè)置所生成 HTML 文檔要使用的標(biāo)題。 此標(biāo)題將在 HTML "title" 元素中使用。
- DocCGIXMLRPCRequestHandler.set_server_name(server_name)?
設(shè)置所生成 HTML 文檔要使用的名稱。 此名稱將出現(xiàn)在所生成文檔頂部的 "h1" 元素中。
- DocCGIXMLRPCRequestHandler.set_server_documentation(server_documentation)?
設(shè)置所生成Set the description used in the generated HTML 文檔要使用的描述。 此描述將顯示為文檔中的一個(gè)段落,位于服務(wù)器名稱之下。