Ñò §ÚêLc @ s\ d Z d d k Z d d k l Z d d k Z d d k Z d d k Z d d k Z d d k Z y d d k Z Wn e j o e Z n Xe d „ Z d „ Z d „ Z d f d „ ƒ YZ d e i f d „ ƒ YZ d e i e f d „ ƒ YZ d e f d „ ƒ YZ e d j oE d GHe d d f ƒ Z e i e ƒ e i d „ d ƒ e i ƒ n d S( s9 Simple XML-RPC Server. This module can be used to create simple XML-RPC servers by creating a server and either installing functions, a class instance, or by extending the SimpleXMLRPCServer class. It can also be used to handle XML-RPC requests in a CGI environment using CGIXMLRPCRequestHandler. A list of possible usage patterns follows: 1. Install functions: server = SimpleXMLRPCServer(("localhost", 8000)) server.register_function(pow) server.register_function(lambda x,y: x+y, 'add') server.serve_forever() 2. Install an instance: class MyFuncs: def __init__(self): # make all of the string functions available through # string.func_name import string self.string = string def _listMethods(self): # implement this method so that system.listMethods # knows to advertise the strings methods return list_public_methods(self) + ['string.' + method for method in list_public_methods(self.string)] def pow(self, x, y): return pow(x, y) def add(self, x, y) : return x + y server = SimpleXMLRPCServer(("localhost", 8000)) server.register_introspection_functions() server.register_instance(MyFuncs()) server.serve_forever() 3. Install an instance with custom dispatch method: class Math: def _listMethods(self): # this method must be present for system.listMethods # to work return ['add', 'pow'] def _methodHelp(self, method): # this method must be present for system.methodHelp # to work if method == 'add': return "add(2,3) => 5" elif method == 'pow': return "pow(x, y[, z]) => number" else: # By convention, return empty # string if no help is available return "" def _dispatch(self, method, params): if method == 'pow': return pow(*params) elif method == 'add': return params[0] + params[1] else: raise 'bad method' server = SimpleXMLRPCServer(("localhost", 8000)) server.register_introspection_functions() server.register_instance(Math()) server.serve_forever() 4. Subclass SimpleXMLRPCServer: class MathServer(SimpleXMLRPCServer): def _dispatch(self, method, params): try: # We are forcing the 'export_' prefix on methods that are # callable through XML-RPC to prevent potential security # problems func = getattr(self, 'export_' + method) except AttributeError: raise Exception('method "%s" is not supported' % method) else: return func(*params) def export_add(self, x, y): return x + y server = MathServer(("localhost", 8000)) server.serve_forever() 5. CGI script: server = CGIXMLRPCRequestHandler() server.register_function(pow) server.handle_request() iÿÿÿÿN( t Faultc C sk | o | i d ƒ } n | g } xA | D]9 } | i d ƒ o t d | ƒ ‚ q* t | | ƒ } q* W| S( sG resolve_dotted_attribute(a, 'b.c.d') => a.b.c.d Resolves a dotted attribute name to an object. Raises an AttributeError if any attribute in the chain starts with a '_'. If the optional allow_dotted_names argument is false, dots are not supported and this function operates similar to getattr(obj, attr). t .t _s( attempt to access private attribute "%s"( t splitt startswitht AttributeErrort getattr( t objt attrt allow_dotted_namest attrst i( ( s* /usr/lib64/python2.6/SimpleXMLRPCServer.pyt resolve_dotted_attributer s c C sS g } t | ƒ D]; } | i d ƒ o$ t t | | ƒ d ƒ o | | q q ~ S( sk Returns a list of attribute strings, found in the specified object, which represent callable attributesR t __call__( t dirR t hasattrR ( R t _[1]t member( ( s* /usr/lib64/python2.6/SimpleXMLRPCServer.pyt list_public_methodsŠ s c C s+ h } x | D] } d | |