2009-01-30 2 views
1

Я новичок в XML-RPC.HOWTO: Регистрация динамической функции XML-RPC в python?

#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. выгрузить fun1

, а затем сделать то же самое с fun2.

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

Я выяснил, как это сделать, но это звучит «неуклюжий, надутый и бесстрашный».

+0

Когда/Почему вы хотите, чтобы отменить функцию? Вы пытаетесь обеспечить, чтобы он вызывался только один раз? Вы пытаетесь обойти тот факт, что нет возможности закрыть SimpleXMLRPCServer? –

ответ

1

Если вы хотите динамический Зарегистрировавшись, зарегистрировать экземпляр объекта, а затем установить атрибуты этого объекта. Вы можете получить более продвинутый метод, используя метод __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()) 
2

Как правило, сервер продолжает работать - поэтому запишите оба метода в начале. Я не понимаю, почему вы хотите отменить регистрацию своих функций. Серверы не работают и обрабатывают несколько запросов. Возможно, вам понадобится функция 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() 
+0

+1: прямо из книги. Кстати, вы могли бы включить ссылку на страницу справки для xmlrpc? –

+0

@Douglas Leeder: Как насчет 4-го шага «разгрузка/отмена регистрации» ... Как я могу заставить сервер отменить регистрацию функции ... –

1

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

#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!