2009-01-30 2 views
1

저는 XML-RPC를 처음 사용합니다. fun1 HOWTO : XML-RPC 동적 함수를 파이썬으로 등록 하시겠습니까?

  • 레지스터 fun1
  • 반환 결과
  • 언로드 fun1
    1. 부하 다음 Fun2에와 같은 수행
      #client code 
      import xmlrpclib 
      proxy = xmlrpclib.ServerProxy("http://localhost:8000/") 
      x,y = arg1,arg2 
      print proxy.fun1(x,y) 
      print proxy.fun2(x,y) 
      

      은 무엇 서버를해야한다.

      가장 좋은 방법은 무엇입니까?

      나는 이것을 할 방법을 알아 냈다. 그러나 그것은 "서툴 렀고, 멀리 가져 왔고 희랍 스럽다"라고 들렸다.

    +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 : 네 번째 단계 인 "언로드/언로드"는 ... 서버에 명령 등록을 취소하려면 어떻게해야합니까? –

    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! 
    
    관련 문제