处理多个请求的Python SOAP服务器库?

1 投票
3 回答
1287 浏览
提问于 2025-04-17 13:07

我在找一个Python库,想要轻松创建一个服务器,这个服务器可以提供网络服务(SOAP),而且能够同时处理多个请求。

我试过使用ZSI和rcplib,但都没成功。

更新:
谢谢大家的回答。ZSI和rcplib(soaplib的继任者)都有自己的Http服务器。我该如何把ZSI/rcplib和你们提到的那些库结合起来呢?

更新2:
经过一些调整,我成功在Linux上安装并运行了这个,似乎效果不错。
然后我在Windows上安装,经过很多麻烦的调整,结果发现WSGIDaemonProcess在Windows上不支持(在mod_wsgi文档中也提到过)。我还是试着运行了一下,确实在每个请求上都能异步工作,但我不确定在高负载下是否能表现得很好。

无论如何,还是谢谢你们...

3 个回答

1

你可以使用soaplib来开发你的SOAP服务。为了让其他人能够使用这个服务,你可以用Apache服务器和mod_wsgi模块来实现。如果你想让它支持多线程或者多进程,可以在mod_wsgi中设置相关参数。

1

抱歉,我可能没有理解你的意思。

我觉得你是想让你的服务器能够同时处理多个HTTP请求,但这样的话,你就不需要担心你的代码或库了。并行处理应该由Apache httpd和mod_wsgi/mod_python模块来完成。

只需要在httpd.conf文件中设置,比如'最大客户端数为100',还有'WSGIDaemonProcess webservice processes=1 threads=100'这样的配置就可以了。

1

这是一个关于 rpclib 的“你好,世界”示例。

请参考这个来自 rpclib 的示例。

# File /home/myhome/test.wsgi
import logging

from rpclib.application import Application
from rpclib.decorator import srpc
from rpclib.interface.wsdl import Wsdl11
from rpclib.protocol.soap import Soap11
from rpclib.service import ServiceBase
from rpclib.model.complex import Iterable
from rpclib.model.primitive import Integer
from rpclib.model.primitive import String
from rpclib.server.wsgi import WsgiApplication

class HelloWorldService(ServiceBase):
    @srpc(String, Integer, _returns=Iterable(String))
    def say_hello(name, times):
        '''
        Docstrings for service methods appear as documentation in the wsdl
        <b>what fun</b>
        @param name the name to say hello to
        @param the number of times to say hello
        @return the completed array
        '''

        for i in xrange(times):
            yield 'Hello, %s' % name

application = WsgiApplication(Application([HelloWorldService], 'rpclib.examples.hello.soap',
                interface=Wsdl11(), in_protocol=Soap11(), out_protocol=Soap11()))

另外,请按照下面的方式修改你的 Apache 配置。

WSGIDaemonProcess example processes=5 threads=5
WSGIProcessGroup example

WSGIScriptAlias / /home/myhome/test.wsgi
<Directory /home/myhome/>
Order deny,allow
Allow from all
</Directory>

根据你的需求,你可以调整进程和线程的数量。

撰写回答