HOWTO: XML-RPC динамическая функция регистрации в python? - PullRequest
1 голос
/ 30 января 2009

Я новичок в XML-RPC.

#client code
import xmlrpclib
proxy = xmlrpclib.ServerProxy("http://localhost:8000/")
x,y = arg1,arg2
print proxy.fun1(x,y)
print proxy.fun2(x,y)

Что должен делать сервер:

  1. загрузить fun1
  2. регистрация fun1
  3. возвращаемый результат
  4. unload fun1

и затем сделайте то же самое с fun2.

Каков наилучший способ сделать это?

Я нашел способ сделать это, но это звучит "неуклюже, надуманно и непитонно".

Ответы [ 3 ]

2 голосов
/ 30 января 2009

Обычно сервер продолжает работать - поэтому зарегистрируйте оба метода при запуске. Я не понимаю, почему вы хотите отменить свои функции. Серверы работают и обрабатывают несколько запросов. Возможно, вам понадобится функция shutdown(), которая отключит весь сервер, но я не вижу возможности отменить регистрацию одной функции.

Самый простой способ - с SimpleXMLRPCServer :

from SimpleXMLRPCServer import SimpleXMLRPCServer

def fun1(x, y):
    return x + y


def fun2(x, y):
    return x - y

server = SimpleXMLRPCServer(("localhost", 8000))
server.register_function(fun1)
server.register_function(fun2)
server.serve_forever()
1 голос
/ 08 августа 2014

Вы можете зарегистрировать функции динамически (после запуска сервера):

#Server side code:
import sys
from SimpleXMLRPCServer import SimpleXMLRPCServer

def dynRegFunc(): #this function will be registered dynamically, from the client
     return True 

def registerFunction(function): #this function will register with the given name
    server.register_function(getattr(sys.modules[__name__], str(function)))

if __name__ == '__main__':
    server = SimpleXMLRPCServer((address, port)), allow_none = True)
    server.register_function(registerFunction)
    server.serve_forever()



#Client side code:

 import xmlrpclib

 if __name__ == '__main__':
     proxy = xmlrpclib.ServerProxy('http://'+str(address)+':'+str(port), allow_none = True)

 #if you'd try to call the function dynRegFunc now, it wouldnt work, since it's not registered -> proxy.dynRegFunc() would fail to execute

 #register function dynamically: 
  proxy.registerFunction("dynRegFunc")
 #call the newly registered function
  proxy.dynRegFunc() #should work now!
1 голос
/ 31 января 2009

Если вы хотите динамическую регистрацию, зарегистрируйте экземпляр объекта, а затем установите атрибуты для этого объекта. Вы можете продвинуться дальше, используя метод __getattr__ класса, если функция должна быть определена во время выполнения.

class dispatcher(object): pass
   def __getattr__(self, name):
     # logic to determine if 'name' is a function, and what
     # function should be returned
     return the_func
server = SimpleXMLRPCServer(("localhost", 8000))
server.register_instance(dispatcher())
...