我正在尝试通过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'
我使用原始类型作为复杂的参数,一切正常。那么问题出在哪里呢?我错过了什么?感谢您的帮助。