13.3 Serving XML-RPC Requests


Credit: Brian Quinlan

13.3.1 Problem

You need to implement an XML-RPC server.

13.3.2 Solution

The xmlrpclib package also makes writing XML-RPC servers pretty easy. Here's how you can write an XML-RPC server:

# server coder sxr_server.py # needs Python 2.2 or the XML-RPC package from PythonWare import SimpleXMLRPCServer class StringFunctions:     def _ _init_ _(self):         # Make all of the Python string functions available through         # python_string.func_name         import string         self.python_string = string     def _privateFunction(self):         # This function cannot be called directly through XML-RPC because         # it starts with an underscore character '_', i.e., it's "private"         pass     def chop_in_half(self, astr):         return astr[:len(astr)/2]     def repeat(self, astr, times):         return astr * times if _ _name_ _=='_ _main_ _':     server = SimpleXMLRPCServer.SimpleXMLRPCServer(("localhost", 8000))     server.register_instance(StringFunctions(  ))     server.register_function(lambda astr: '_' + astr, '_string')     server.serve_forever(  )

And here is a client that accesses the server you just wrote:

# server coder sxr_client.py # needs Python 2.2 or the XML-RPC package from PythonWare import xmlrpclib server = xmlrpclib.Server('http://localhost:8000') print server.chop_in_half('I am a confidant guy') print server.repeat('Repetition is the key to learning!\n', 5) print server._string('<= underscore') print server.python_string.join(['I', 'like it!'], " don't ") print server._privateFunction(  )    # will throw an exception

13.3.3 Discussion

This recipe demonstrates the creation of a simple XML-RPC server using the SimpleXMLRPCServer class. It requires Python 2.2 or later or the XML-RPC package from PythonWare (http://www.pythonware.com/products/xmlrpc/index.htm).

SimpleXMLRPCServer is a simple class that listens for HTTP requests on a specified port and dispatches any XML-RPC calls to a registered instance or a registered function. This recipe demonstrates both usages. To create a server, we instantiate SimpleXMLRPCServer, supplying the hostname and port for the server. Then, on that instance, we can call register_instance as many times as needed to make other instances available as services. Alternately, we can call register_function to make functions similarly available as services. Once we have registered all the instances and functions we want to expose, we call serve_forever on the server instance, and our XML-RPC server is active. Yes, it is really that simple.

Registering a function (as opposed to an instance) is necessary if your function's name begins with an underscore (_) or contains characters not allowed in Python identifiers (e.g., Unicode characters, plus signs, etc.) Note that dotted names (e.g., python_string.join) are correctly resolved for registered instances.

13.3.4 See Also

The XML-RPC library ships with recent versions of Python; if it isn't in your version of Python, you can get it from http://www.pythonware.com/products/xmlrpc/.



Python Cookbook
Python Cookbook
ISBN: 0596007973
EAN: 2147483647
Year: 2005
Pages: 346

flylib.com © 2008-2017.
If you may any questions please contact us: flylib@qtcs.net