xmlrpc.server
— Grundläggande XML-RPC-servrar¶
Källkod: Lib/xmlrpc/server.py
Modulen xmlrpc.server
tillhandahåller ett grundläggande serverramverk för XML-RPC-servrar skrivna i Python. Servrar kan antingen vara fristående, med SimpleXMLRPCServer
, eller inbäddade i en CGI-miljö, med CGIXMLRPCRequestHandler
.
Varning
Modulen xmlrpc.server
är inte säker mot skadligt konstruerade data. Om du behöver analysera icke betrodda eller oautentiserade data, se XML-säkerhet.
Tillgänglighet: not WASI.
Den här modulen fungerar inte eller är inte tillgänglig på WebAssembly. Se WebAssembly-plattformar för mer information.
- class xmlrpc.server.SimpleXMLRPCServer(addr, requestHandler=SimpleXMLRPCRequestHandler, logRequests=True, allow_none=False, encoding=None, bind_and_activate=True, use_builtin_types=False)¶
Skapa en ny serverinstans. Denna klass tillhandahåller metoder för registrering av funktioner som kan anropas av XML-RPC-protokollet. Parametern requestHandler bör vara en fabrik för requesthandler-instanser; standardvärdet är
SimpleXMLRPCRequestHandler
. Parametrarna addr och requestHandler skickas till konstruktören försocketserver.TCPServer
. Om logRequests är true (standard) kommer förfrågningar att loggas; om parametern är false stängs loggning av. Parametrarna allow_none och encoding skickas vidare tillxmlrpc.client
och styr de XML-RPC-svar som kommer att returneras från servern. Parametern bind_and_activate styr omserver_bind()
ochserver_activate()
anropas omedelbart av konstruktören; standardvärdet är true. Om den sätts till false kan koden manipulera klassvariabeln allow_reuse_address innan adressen är bunden. Parametern use_builtin_types skickas till funktionenloads()
och styr vilka typer som bearbetas när datum-/tidsvärden eller binära data tas emot; standardvärdet är false.Ändrad i version 3.3: Flaggan use_builtin_types har lagts till.
- class xmlrpc.server.CGIXMLRPCRequestHandler(allow_none=False, encoding=None, use_builtin_types=False)¶
Skapa en ny instans för att hantera XML-RPC-förfrågningar i en CGI-miljö. Parametrarna allow_none och encoding skickas vidare till
xmlrpc.client
och styr de XML-RPC-svar som returneras från servern. Parametern use_builtin_types skickas till funktionenloads()
och styr vilka typer som behandlas när datum-/tidsvärden eller binära data tas emot; standardvärdet är false.Ändrad i version 3.3: Flaggan use_builtin_types har lagts till.
- class xmlrpc.server.SimpleXMLRPCRequestHandler¶
Skapa en ny instans av request handler. Denna request handler stöder
POST
requests och modifierar loggningen så att parametern logRequests tillSimpleXMLRPCServer
constructor parameter respekteras.
SimpleXMLRPCServer-objekt¶
Klassen SimpleXMLRPCServer
är baserad på socketserver.TCPServer
och gör det möjligt att skapa enkla, fristående XML-RPC-servrar.
- SimpleXMLRPCServer.register_function(function=None, name=None)¶
Registrerar en funktion som kan svara på XML-RPC-förfrågningar. Om name anges kommer det att vara det metodnamn som associeras med function, annars kommer
function.__name__
att användas. name är en sträng och kan innehålla tecken som inte är tillåtna i Python-identifierare, inklusive periodtecknet.Denna metod kan också användas som en dekorator. När den används som en dekorator kan name endast anges som ett nyckelordsargument för att registrera function under name. Om inget namn anges kommer
function.__name__
att användas.Ändrad i version 3.7:
register_function()
kan användas som dekorator.
- SimpleXMLRPCServer.register_instance(instance, allow_dotted_names=False)¶
Registrera ett objekt som används för att exponera metodnamn som inte har registrerats med hjälp av
register_function()
. Om instance innehåller en_dispatch()
-metod, anropas den med det begärda metodnamnet och parametrarna från begäran. Dess API ärdef _dispatch(self, method, params)
(observera att params inte representerar en variabel argumentlista). Om den anropar en underliggande funktion för att utföra sin uppgift, kallas den funktionen somfunc(*params)
och utökar parameterlistan. Returvärdet från_dispatch()
returneras till klienten som resultat. Om instance inte har någon_dispatch()
-metod, söks den efter ett attribut som matchar namnet på den begärda metoden.Om det valfria argumentet allow_dotted_names är true och instansen inte har någon
_dispatch()
-metod, och det begärda metodnamnet innehåller punkter, söks varje komponent i metodnamnet individuellt, vilket innebär att en enkel hierarkisk sökning utförs. Det värde som hittas vid denna sökning anropas sedan med parametrarna från begäran och returvärdet skickas tillbaka till klienten.Varning
Om du aktiverar alternativet allow_dotted_names får inkräktare tillgång till modulens globala variabler och kan köra godtycklig kod på din dator. Använd endast det här alternativet i ett säkert, slutet nätverk.
- SimpleXMLRPCServer.register_introspection_functions()¶
Registrerar XML-RPC introspektionsfunktionerna
system.listMethods
,system.methodHelp
ochsystem.methodSignature
.
- SimpleXMLRPCServer.register_multicall_functions()¶
Registrerar XML-RPC multicall-funktionen system.multicall.
- SimpleXMLRPCRequestHandler.rpc_paths¶
Ett attributvärde som måste vara en tupel som listar giltiga sökvägsdelar av URL:en för mottagning av XML-RPC-förfrågningar. Förfrågningar som skickas till andra sökvägar kommer att resultera i ett HTTP-fel 404 ”no such page”. Om denna tupel är tom kommer alla sökvägar att betraktas som giltiga. Standardvärdet är
('/', '/RPC2')
.
Exempel på SimpleXMLRPCServer¶
Serverkod:
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()
Följande klientkod anropar de metoder som görs tillgängliga av den föregående servern:
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()
kan också användas som en dekorator. Det föregående serverexemplet kan registrera funktioner på ett dekorativt sätt:
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()
Följande exempel som ingår i modulen Lib/xmlrpc/server.py
visar en server som tillåter prickade namn och registrerar en multicall-funktion.
Varning
Om du aktiverar alternativet allow_dotted_names får inkräktare tillgång till modulens globala variabler och kan köra godtycklig kod på din dator. Använd detta exempel endast inom ett säkert, slutet nätverk.
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)
Denna ExampleService-demo kan startas från kommandoraden:
python -m xmlrpc.server
Klienten som interagerar med ovanstående server ingår i Lib/xmlrpc/client.py
:
server = ServerProxy("http://localhost:8000")
försök:
print(server.currentTime.getCurrentTime())
except Error as v:
print("ERROR", v)
multi = MultiCall(server)
multi.getData()
multi.pow(2,9)
multi.add(1,2)
försök:
for svar i multi():
print(svar)
except Error as v:
print("ERROR", v)
Denna klient som interagerar med demo XMLRPC-servern kan anropas som:
python -m xmlrpc.client
CGIXMLRPCFörfrågningshanterare¶
Klassen CGIXMLRPCRequestHandler
kan användas för att hantera XML-RPC-förfrågningar som skickas till Python CGI-skript.
- CGIXMLRPCRequestHandler.register_function(function=None, name=None)¶
Registrerar en funktion som kan svara på XML-RPC-förfrågningar. Om name anges kommer det att vara det metodnamn som associeras med function, annars kommer
function.__name__
att användas. name är en sträng och kan innehålla tecken som inte är tillåtna i Python-identifierare, inklusive periodtecknet.Denna metod kan också användas som en dekorator. När den används som en dekorator kan name endast anges som ett nyckelordsargument för att registrera function under name. Om inget namn anges kommer
function.__name__
att användas.Ändrad i version 3.7:
register_function()
kan användas som dekorator.
- CGIXMLRPCRequestHandler.register_instance(instance)¶
Registrera ett objekt som används för att exponera metodnamn som inte har registrerats med hjälp av
register_function()
. Om instance innehåller en_dispatch()
-metod anropas den med det begärda metodnamnet och parametrarna från begäran; returvärdet returneras till klienten som resultat. Om instance inte har någon_dispatch()
-metod söks den efter ett attribut som matchar namnet på den begärda metoden; om det begärda metodnamnet innehåller perioder söks varje komponent i metodnamnet individuellt, vilket innebär att en enkel hierarkisk sökning utförs. Det värde som hittas vid denna sökning anropas sedan med parametrarna från begäran, och returvärdet skickas tillbaka till klienten.
- CGIXMLRPCRequestHandler.register_introspection_functions()¶
Registrera XML-RPC introspektionsfunktionerna
system.listMethods
,system.methodHelp
ochsystem.methodSignature
.
- CGIXMLRPCRequestHandler.register_multicall_functions()¶
Registrera XML-RPC multicall-funktionen
system.multicall
.
- CGIXMLRPCRequestHandler.handle_request(request_text=None)¶
Hantera en XML-RPC-begäran. Om request_text anges bör det vara POST-data som tillhandahålls av HTTP-servern, annars kommer innehållet i stdin att användas.
Exempel:
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()
Dokumentation av XMLRPC-server¶
Dessa klasser utökar ovanstående klasser för att servera HTML-dokumentation som svar på HTTP GET-begäranden. Servrar kan antingen vara fristående, med DocXMLRPCServer
, eller inbäddade i en CGI-miljö, med DocCGIXMLRPCRequestHandler
.
- class xmlrpc.server.DocXMLRPCServer(addr, requestHandler=DocXMLRPCRequestHandler, logRequests=True, allow_none=False, encoding=None, bind_and_activate=True, use_builtin_types=True)¶
Skapa en ny serverinstans. Alla parametrar har samma betydelse som för
SimpleXMLRPCServer
; requestHandler är standard förDocXMLRPCRequestHandler
.Ändrad i version 3.3: Flaggan use_builtin_types har lagts till.
- class xmlrpc.server.DocCGIXMLRPCRequestHandler¶
Skapa en ny instans för att hantera XML-RPC-begäranden i en CGI-miljö.
- class xmlrpc.server.DocXMLRPCRequestHandler¶
Skapa en ny instans av request handler. Denna request handler stöder XML-RPC POST requests, documentation GET requests och modifierar loggning så att parametern logRequests till
DocXMLRPCServer
constructor parameter respekteras.
DocXMLRPCServer-objekt¶
Klassen DocXMLRPCServer
är härledd från SimpleXMLRPCServer
och gör det möjligt att skapa självdokumenterande, fristående XML-RPC-servrar. HTTP POST-förfrågningar hanteras som XML-RPC-metodanrop. HTTP GET-förfrågningar hanteras genom att generera HTML-dokumentation i pydoc-stil. Detta gör att en server kan tillhandahålla sin egen webbaserade dokumentation.
- DocXMLRPCServer.set_server_title(server_title)¶
Ange den titel som används i den genererade HTML-dokumentationen. Denna titel kommer att användas inuti HTML-elementet ”title”.
- DocXMLRPCServer.set_server_name(server_name)¶
Ange det namn som används i den genererade HTML-dokumentationen. Detta namn kommer att visas högst upp i den genererade dokumentationen i ett ”h1”-element.
- DocXMLRPCServer.set_server_documentation(server_documentation)¶
Ange den beskrivning som används i den genererade HTML-dokumentationen. Beskrivningen kommer att visas som ett stycke under servernamnet i dokumentationen.
DocCGIXMLRPCRequestHandler¶
Klassen DocCGIXMLRPCRequestHandler
är härledd från CGIXMLRPCRequestHandler
och gör det möjligt att skapa självdokumenterande XML-RPC CGI-skript. HTTP POST-förfrågningar hanteras som XML-RPC-metodanrop. HTTP GET-begäranden hanteras genom att generera HTML-dokumentation i pydoc-stil. Detta gör att en server kan tillhandahålla sin egen webbaserade dokumentation.
- DocCGIXMLRPCRequestHandler.set_server_title(server_title)¶
Ange den titel som används i den genererade HTML-dokumentationen. Denna titel kommer att användas inuti HTML-elementet ”title”.
- DocCGIXMLRPCRequestHandler.set_server_name(server_name)¶
Ange det namn som används i den genererade HTML-dokumentationen. Detta namn kommer att visas högst upp i den genererade dokumentationen i ett ”h1”-element.
- DocCGIXMLRPCRequestHandler.set_server_documentation(server_documentation)¶
Ange den beskrivning som används i den genererade HTML-dokumentationen. Beskrivningen kommer att visas som ett stycke under servernamnet i dokumentationen.