2014-02-15 2 views
0

Я только начал использовать Spyne и попытался использовать ComplexModel в качестве параметра для одного метода. Я в основном следовал примеру user_manager из источников со spyne < 2.99, но при вызове client.factory.create() всегда получаю ошибку типа.ComplexModel недоступен на клиенте

Пример кода, который не удается:

from spyne.application import Application 
from spyne.decorator import rpc 
from spyne.service import ServiceBase 
from spyne.protocol.soap import Soap11 
from spyne.model.primitive import String, Integer 
from spyne.model.complex import ComplexModel 

class DatosFac(ComplexModel): 
    __namespace__ = 'facturamanager.datosfac' 
    numero = String(pattern=r'[A-Z]/[0-9]+') 

class FacturaService(ServiceBase): 
    @rpc(String, DatosFac, _returns=Integer) 
    def updateFacData(self, numero, data): 
     # do stuff 
     return 1 

application = Application([FacturaService], 'facturaManager.service', 
     in_protocol=Soap11(validator='lxml'), 
     out_protocol=Soap11() 
    ) 

from spyne.server.null import NullServer 
s = NullServer(application) 
data = s.factory.create('DatosFac') 

Если запустить этот код вы получите:

Traceback (most recent call last): 
    File "spyner.py", line 25, in <module> 
    data = s.factory.create('DatosFac') 
    File "/Users/marc/.pyEnvs/default/lib/python2.7/site-packages/spyne/client/_base.py", line 30, in create 
    return self.__app.interface.get_class_instance(object_name) 
    File "/Users/marc/.pyEnvs/default/lib/python2.7/site-packages/spyne/interface/_base.py", line 114, in get_class_instance 
    return self.classes[key]() 
KeyError: 'DatosFac' 

(я использовал NullServer, чтобы сделать его легче воспроизвести, но то же самое происходит через мыло + WSGI).

I amb довольно сильно застрял в этом, поскольку я не вижу, что существенно отличается от этого кода и примеров user_manager.

Что я делаю неправильно?

спасибо, МАРК

ответ

0

Спасибо за предоставление полностью рабочий пример.

Разница в том, что tns и пространство имен DatosFac отличаются.

Либо сделать:

data = s.factory.create('{facturamanager.datosfac}DatosFac') 

__namespace__ или удалить из DatosFac определения

+0

Это сработало, спасибо! ;) –

Смежные вопросы