从另一个应用程序内部调用金字塔框架应用程序

Invoking a pyramid framework application from inside another application

我在框架中有一个 Python 应用程序 运行,它驱动网络协议来控制远程设备。现在想加个基于浏览器的监控,正在看金字塔框架搭建。

通常您从命令行使用 pserve 启动 Pyramid 应用程序,但我找不到任何关于如何在主机应用程序框架内调用它的文档或示例。这需要以 Pyramid 代码可以访问主机应用程序中的对象的方式完成。

这是 Pyramid 的实际用例还是我应该寻找其他一些基于 WSGI 的框架来做到这一点?

WSGI 应用程序基本上是一个接收一些输入和 returns 响应的函数,您实际上并不需要 pserve 来为 WSGI 应用程序提供服务,它更像是一个包装器,用于组装来自 .ini 文件的应用程序。

查看 Pyramid 文档中的 Creating Your First Pyramid Application 章节:

from wsgiref.simple_server import make_server
from pyramid.config import Configurator
from pyramid.response import Response

def hello_world(request):
    return Response('Hello %(name)s!' % request.matchdict)

if __name__ == '__main__':
    config = Configurator()
    config.add_route('hello', '/hello/{name}')
    config.add_view(hello_world, route_name='hello')
    app = config.make_wsgi_app()
    server = make_server('0.0.0.0', 8080, app)
    server.serve_forever()

最后两行创建一个侦听端口 8080 的服务器。

现在,更棘手的问题是 serve_forever 调用 阻塞 ,i.e.the 程序在该行停止,直到您点击 Ctrl-C 并停止脚本。这使得让你的程序同时为 "drive a network protocol to control remote devices" 和提供网页服务变得有点不平凡(这不同于其他基于事件的平台,例如 Node.js ,其中有两个服务器是微不足道的在同一个进程中监听不同的端口)。

此问题的一个可能解决方案是 运行 网络服务器在一个单独的线程中。