xmlrpc.server --- 基本 XML-RPC 伺服器¶
xmlrpc.server 模組為以 Python 撰寫的 XML-RPC 伺服器提供了基本的伺服器框架。伺服器可以是獨立執行的(使用 SimpleXMLRPCServer),或嵌入在 CGI 環境中(使用 CGIXMLRPCRequestHandler)。
警告
xmlrpc.server 模組對於惡意建構的資料並不安全。如果你需要剖析不受信任或未經驗證的資料,請參閱 XML 安全性。
可用性: not WASI.
此模組在 WebAssembly 平台上不起作用或無法使用。更多資訊請參閱 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 參數應該是請求處理器實例的工廠(factory);它預設為
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)¶
建立一個新的實例以在 CGI 環境中處理 XML-RPC 請求。allow_none 和 encoding 參數會傳遞給
xmlrpc.client並控制從伺服器回傳的 XML-RPC 回應。use_builtin_types 參數會傳遞給loads()函式,並控制在接收到日期/時間值或二進位資料時要處理哪些型別;它預設為 false。在 3.3 版的變更: 新增 use_builtin_types 旗標。
- class xmlrpc.server.SimpleXMLRPCRequestHandler¶
建立一個新的請求處理器實例。此請求處理器支援
POST請求,並修改日誌記錄功能以遵守SimpleXMLRPCServer建構函式的 logRequests 參數。
SimpleXMLRPCServer 物件¶
SimpleXMLRPCServer 類別是基於 socketserver.TCPServer 的,並提供了建立簡單、獨立 XML-RPC 伺服器的方式。
- SimpleXMLRPCServer.register_function(function=None, name=None)¶
註冊一個可以回應 XML-RPC 請求的函式。如果有給定 name,它將成為與 function 關聯的方法名稱,否則將使用
function.__name__。name 是一個字串,可以包含在 Python 識別符中不合法的字元,包括句點字元。此方法也可以用作裝飾器。當用作裝飾器時,name 只能作為關鍵字引數給定,以在 name 下註冊 function。如果沒有給定 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 自我檢查函式 (introspection functions)
system.listMethods、system.methodHelp和system.methodSignature。
- SimpleXMLRPCServer.register_multicall_functions()¶
註冊 XML-RPC 多重呼叫函式 (multicall function) system.multicall。
- SimpleXMLRPCRequestHandler.rpc_paths¶
一個屬性值,必須是一個元組,列出接收 XML-RPC 請求的 URL 的有效路徑部分。發布到其他路徑的請求將導致 404 "no such page" HTTP 錯誤。如果此元組為空,所有路徑都將被視為有效。預設值為
('/', '/RPC2')。
SimpleXMLRPCServer 範例¶
伺服器程式碼:
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()
# 註冊 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()
以下用戶端程式碼將呼叫前述伺服器提供的方法:
import xmlrpc.client
s = xmlrpc.client.ServerProxy