0

我有一个工作的 web.py 应用程序和一个工作的 Spyne 应用程序。我想在匹配某个 url 时向 spyne 应用程序发出 web.py 路由请求。

我按照 web.py 文档尝试了一个包装器,但没有运气。

在 myspyne.py 中:

import logging
logging.basicConfig(level=logging.DEBUG)
from spyne.application import Application
from spyne.decorator import srpc
from spyne.service import ServiceBase
from spyne.model.primitive import Integer
from spyne.model.primitive import Unicode
from spyne.model.complex import Iterable
from spyne.protocol.soap import Soap11

class HelloWorldService(ServiceBase):
    @srpc(Unicode, Integer, _returns=Iterable(Unicode))
    def say_hello(name, times):
        for i in range(times):
            yield 'Hello, %s' % name

application = Application([HelloWorldService],
                      tns='my.custom.ns',
                      in_protocol=Soap11(validator='lxml'),
                      out_protocol=Soap11())

在 myweb.py 中:

urls = (
    '/', 'index',
    '/myspyne/(.*)', myspyne.application, # this does not work
)

class index:
    def GET(self):
        return "hello"

app = web.application(urls, globals(), autoreload=False)
application = app.wsgifunc()
if __name__ == '__main__':
    app.run()
4

1 回答 1

1

您需要实现 web.py 传输,或者找到一种方法从 web.py 公开 wsgi 应用程序。您链接到的那个文档非常古老(对我来说似乎是几十年前:))。

我根本没有使用 web.py 的经验。但基于该文档的 web.py 部分,这可以工作:

def start_response(status, headers):
    web.ctx.status = status
    for header, value in headers:
        web.header(header, value)


class WebPyTransport(WsgiApplication):
    """Class for web.py """
    def GET(self):
        response = self(web.ctx.environ, start_response)
        return render("\n".join(response))

    def POST(self):
        response = self(web.ctx.environ, start_response)
        return render("\n".join(response))

有了这个,你可以使用:

application = Application(...)
webpy_app = WebPyTransport(application)

于是urls变成:

urls = (
    '/', 'index',
    '/myspyne/(.*)', myspyne.webpy_app,
)

我希望这会有所帮助。

于 2013-07-20T11:07:01.297 回答