2013-04-19 2 views
2

서버 (CherryPy 3.2.0) XMLRPC을 수행하는 방법 :CherryPy

import cherrypy 

class XMLRPCServer(cherrypy._cptools.XMLRPCController): 
    def index(self): 
     return 'index' 
    index.exposed = True 

if __name__ =='__main__': 
    cherrypy.config.update({ 
     'server.thread_pool': 1, 
     'request.dispatch': cherrypy.dispatch.XMLRPCDispatcher, 
     'tools.xmlrpc.on': True, 
     'tools.xmlrpc.allow_none': 0, 
    }) 
    cherrypy.quickstart(XMLRPCServer()) 

클라이언트 (파이썬 2.7.1) :

import xmlrpclib 
svc = xmlrpclib.ServerProxy('http://127.0.0.1:8080') 
r = svc.index() 

오류 : 어떻게

Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "/usr/lib/python2.7/xmlrpclib.py", line 1224, in __call__ 
    return self.__send(self.__name, args) 
    File "/usr/lib/python2.7/xmlrpclib.py", line 1575, in __request 
    verbose=self.__verbose 
    File "/usr/lib/python2.7/xmlrpclib.py", line 1264, in request 
    return self.single_request(host, handler, request_body, verbose) 
    File "/usr/lib/python2.7/xmlrpclib.py", line 1312, in single_request 
    response.msg, 
xmlrpclib.ProtocolError: <ProtocolError for 127.0.0.1:8080/RPC2: 404 Not Found> 

을 CherryPy에서 xml-rpc를 사용하도록 설정했는데 봤지만 문서를 읽었지만 여전히 붙어 있습니다.

답변

2

여기 XMLRPCController 문서에서 relavant 인용입니다 :

The XMLRPCDispatcher strips any /RPC2 prefix; if you aren’t using /RPC2 in your URL’s, you can safely skip turning on the XMLRPCDispatcher.

다음은 잘 작동합니다. 또한 글로벌 및 응용 프로그램 구성을 분리 할 때주의해야합니다.

sever.py

#!/usr/bin/env python 
# -*- coding: utf-8 -*- 


import cherrypy 


config = { 
    'global' : { 
    'server.socket_host' : '127.0.0.1', 
    'server.socket_port' : 8080, 
    'server.thread_pool' : 8 
    }, 
    '/' : { 
    'tools.xmlrpc.allow_none' : True 
    } 
} 


class Api(cherrypy._cptools.XMLRPCController): 

    @cherrypy.expose 
    def mul(self, a, b): 
    return a * b 


if __name__ == '__main__': 
    cherrypy.quickstart(Api(), '/api', config) 

client.py

#!/usr/bin/env python 
# -*- coding: utf-8 -*- 


import xmlrpclib 


rpc = xmlrpclib.ServerProxy('http://localhost:8080/api') 
print rpc.mul(2, 6)