在Spyne框架中作为方法参数的复杂类型

问题描述 投票:0回答:1

我正在尝试通过Spyne framewok在Python中实现SOAP服务器。我提出了具有文档样式和某些功能的WSDL文件。这些函数具有复杂的类型作为参数。我安装了最新版本的Spyne 2.12.16,并根据Spyne doc进行了安装。我写了以下代码:

class PublicationDto(ComplexModel):

    publicationId = Integer
    title = String
    year = Short
    authors = String
    documentName = String

class PublicationService(ServiceBase):

    @rpc(
        PublicationDto)
    def add_publication(self, publication):
        print(publication)

    @rpc(
        _returns=Iterable(PublicationDto))
    def get_publications(self):
        return publication_service.get_publication_all()

application = Application([PublicationService], 'spyne.examples.hello.soap',
                          in_protocol=Soap11(validator=None),
                          out_protocol=Soap11())

wsgi_application = WsgiApplication(application)

if __name__ == '__main__':

    from wsgiref.simple_server import make_server

    server = make_server('127.0.0.1', 8000, wsgi_application)
    server.serve_forever()

功能get_publications正常工作,服务器向我返回了正确的数据。但是add_publication出现问题,Spyne无法正确处理它。它返回以下错误:

Traceback (most recent call last):
  File "/usr/lib/python3.6/wsgiref/handlers.py", line 137, in run
    self.result = application(self.environ, self.start_response)
  File "/server/venv/lib/python3.6/site-packages/spyne/server/wsgi.py", line 244, in __call__
    return self.handle_rpc(req_env, start_response)
  File "/server/venv/lib/python3.6/site-packages/spyne/server/wsgi.py", line 356, in handle_rpc
    self.get_in_object(p_ctx)
  File "/server/venv/lib/python3.6/site-packages/spyne/server/_base.py", line 93, in get_in_object
    message=self.app.in_protocol.REQUEST)
  File "/server/venv/lib/python3.6/site-packages/spyne/protocol/soap/soap11.py", line 263, in deserialize
    ctx.in_object = self.from_element(ctx, body_class, ctx.in_body_doc)
  File "/server/venv/lib/python3.6/site-packages/spyne/protocol/xml.py", line 443, in from_element
    return handler(ctx, cls, element)
  File "/server/venv/lib/python3.6/site-packages/spyne/protocol/xml.py", line 923, in complex_from_element
    value = self.from_element(ctx, member, c)
  File "/server/venv/lib/python3.6/site-packages/spyne/protocol/xml.py", line 443, in from_element
    return handler(ctx, cls, element)
  File "/server/venv/lib/python3.6/site-packages/spyne/protocol/xml.py", line 885, in complex_from_element
    inst = cls.get_deserialization_instance()
  File "/server/venv/lib/python3.6/site-packages/spyne/model/complex.py", line 931, in get_deserialization_instance
    return cls()
  File "/server/venv/lib/python3.6/site-packages/spyne/model/complex.py", line 781, in __init__
    fti = cls.get_flat_type_info(cls)
AttributeError: type object 'ComplexModelMeta' has no attribute 'get_flat_type_info'

我使用原始类型作为复杂的参数,一切正常。那么问题出在哪里呢?我错过了什么?感谢您的帮助。

python soap spyne
1个回答
© www.soinside.com 2019 - 2024. All rights reserved.