0

我刚开始使用 Spyne 并尝试使用 ComplexModel 作为一种方法的参数。我主要使用 spyne<2.99 的源代码中的 user_manager 示例,但在执行 client.factory.create() 调用时总是出现类型错误。

失败的示例代码:

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 使其更容易重现,但同样的情况发生在 Soap+Wsgi 上)。

我几乎坚持这一点,因为我看不出与此代码和 user_manager 示例有什么本质不同。

我究竟做错了什么?

谢谢,马克

4

1 回答 1

0

感谢您提供一个完整的工作示例。

不同的是tns和DatosFac的命名空间不同。

要么做:

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

__namespace__DatosFac定义中删除

于 2014-02-15T21:07:21.990 回答