Сколько классов / экземпляров мы можем зарегистрировать на сервере xml rpc?
Я пытаюсь создать 2 класса в модуле xml rpc-сервера, а затем регистрирую экземпляры обоих классов на сервере xml rpc. Я могу запускать методы из обоих экземпляров, когда они зарегистрированы в одиночку, однако, когда я запускаю только один из них, получить регистр, а другой выдает ошибку. Также я могу видеть только методы класса, экземпляр которого я зарегистрировал последним. Мне было интересно, есть ли limation на нет. случаев я могу зарегистрироваться на сервере, как я помню, читая что-то вроде этого, но я не могу найти упоминание в документации сейчас?
Это мой код сервера -
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()
Это мой код клиента -
импортировать xmlrpclib
try:
#s = xmlrpclib.ServerProxy(r'http://administrator:passw0rd@172.19.201.59: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 ответа
У меня такой же опыт, как и у вас, он не полностью указан в документации, но только один экземпляр может быть зарегистрирован.
Вы все еще можете сделать что-то вроде:
class AllFuncs(MyFuncs, MyFuncs2):
pass
server.register_instance(AllFuncs)
Я действительно обнаружил, что это упоминается в определении модуля, если вы посмотрите на код, однако, это не упоминается в документах на веб-сайте python. Вот полное описание - Регистрирует экземпляр для ответа на запросы XML-RPC.
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.