how many classes/instances can we register into xml rpc server?

2.6k views Asked by At

I'm trying to create 2 classed in xml rpc server module and then registering the instances of the both the classes to xml rpc server. I'm able to run the methods from both the instances when registered alone , however when i run only on of them get register and the other one throws error. Also I'm only able to see the methods of class whose instance i've registered last. I was wondering is there is limation on the no. of instances i can register in server, as I remember reading something like this but I can't find mention in the documentation now?

This is my server code -

from SimpleXMLRPCServer import SimpleXMLRPCServer
from SimpleXMLRPCServer import SimpleXMLRPCRequestHandler
# Restrict to a particular path.
class RequestHandler(SimpleXMLRPCRequestHandler):
    rpc_paths = ('/RPC2',)

# Create server
server = SimpleXMLRPCServer(("localhost", 8000), requestHandler=RequestHandler)
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)
#server.register_instance(FileOperation)
server.register_instance(file)
# 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 'div').
class MyFuncs:
    def div(self, x, y):
        return x // y
class MyFuncs2:
    def modulus(self, x, y):
        return x % y
server.register_instance(MyFuncs2())
server.register_instance(MyFuncs())

# Run the server's main loop
server.serve_forever()

This is my client code -

import xmlrpclib

try:
    #s = xmlrpclib.ServerProxy(r'http://administrator:[email protected]:8000')
    s = xmlrpclib.ServerProxy(r'http://localhost:8000')
    print s.system.listMethods()
    print s.pow(2,3)  # Returns 2**3 = 8
    print s.add(2,3)  # Returns 5
    print s.div(5,2)  # Returns 5//2 = 2
    print s.moduls(5,2)
except Exception,err:
    print err
2

There are 2 answers

0
MatthieuW On BEST ANSWER

I have the same experience as you, it's not completely explicit in the doc, but only one instance can be registered.

You can still do something like:

class AllFuncs(MyFuncs, MyFuncs2):
    pass

server.register_instance(AllFuncs)
0
Hemant On

I actually found out that this is mentioned in the module definition if you look into the code, however, this is not mentioned in the documents on python website. Here is the complete description - Registers an instance to respond to XML-RPC requests.

Only one instance can be installed at a time.

If the registered instance has a _dispatch method then that
method will be called with the name of the XML-RPC method 
 and
its parameters as a tuple
e.g. instance._dispatch('add',(2,3))

If the registered instance does not have a _dispatch method
then the instance will be searched to find a matching method
and, if found, will be called. Methods beginning with an '_'
are considered private and will not be called by
SimpleXMLRPCServer.

If a registered function matches a XML-RPC request, then it
will be called instead of the registered instance.

If the optional allow_dotted_names argument is true and the
instance does not have a _dispatch method, method names
containing dots are supported and resolved, as long as none of
the name segments start with an '_'.

*** SECURITY WARNING: ***

Enabling the allow_dotted_names options allows intruders
to access your module's global variables and may allow
intruders to execute arbitrary code on your machine.  Only
use this option on a secure, closed network.