2010-09-21 9 views
6

Je construis le service rpc de xml en utilisant twisted et je voudrais utiliser None tout comme il peut être fait en librairie python standard. Comment puis-je transmettre allow_none à la version tordue du serveur xmlrpc?allow_none dans le serveur XML-RPC tordu

EDIT

In [28]: sock = rpc.ServerProxy('http://localhost:7080',allow_none=True) 

In [29]: sock 
Out[29]: <ServerProxy for localhost:7080/RPC2> 

In [30]: sock.list_reports() 
Out[30]: ['example'] 

In [31]: sock.run_report('example') 
--------------------------------------------------------------------------- 
Fault          Traceback (most recent call last) 

reports/<ipython console> in <module>() 

/usr/lib/python2.6/xmlrpclib.pyc in __call__(self, *args) 
    1197   return _Method(self.__send, "%s.%s" % (self.__name, name)) 
    1198  def __call__(self, *args): 
-> 1199   return self.__send(self.__name, args) 
    1200 
    1201 ## 


/usr/lib/python2.6/xmlrpclib.pyc in __request(self, methodname, params) 
    1487    self.__handler, 
    1488    request, 
-> 1489    verbose=self.__verbose 
    1490   ) 
    1491 

/usr/lib/python2.6/xmlrpclib.pyc in request(self, host, handler, request_body, verbose) 
    1251    sock = None 
    1252 
-> 1253   return self._parse_response(h.getfile(), sock) 
    1254 
    1255  ## 


/usr/lib/python2.6/xmlrpclib.pyc in _parse_response(self, file, sock) 
    1390   p.close() 
    1391 
-> 1392   return u.close() 
    1393 
    1394 ## 


/usr/lib/python2.6/xmlrpclib.pyc in close(self) 
    836    raise ResponseError() 
    837   if self._type == "fault": 
--> 838    raise Fault(**self._stack[0]) 
    839   return tuple(self._stack) 
    840 

Fault: <Fault 8002: "Can't serialize output: cannot marshal None unless allow_none is enabled"> 

Répondre

8

XMLRPC accepte allowNone en tant qu'argument de son initialiseur. Ainsi, passez True lors de l'instanciation de vos ressources si vous souhaitez prendre en charge None.

from twisted.web.xmlrpc import XMLRPC 
resource = XMLRPC(allowNone=True) 
+0

Ouais, ça marche très bien. Merci beaucoup. – gruszczy

0

Je pense qu'il devrait être spécifié sur le côté client ...

lorsque vous créez le proxy de votre client xmlrpc - vous pouvez passer l'argument de mot-clé allow_none = True pour python module xmlrpclib comme ci-dessous ...

In [184]: import xmlrpclib as rpc 

In [185]: sock = rpc.ServerProxy('http://localhost/xmlrpc/object',allow_none=True) 

EDIT:

from twisted.web.xmlrpc import Proxy 
proxy = Proxy('http://localhost/xmlrpc', allowNone=True) 
+1

Il ne suffit pas de définir cela dans le client. – gruszczy

+1

correct, vous devez également spécifier cela côté serveur. serveur = SimpleXMLRPCServer (("0.0.0.0", 8000), allow_none = True) – db42