【问题标题】:Invoking a pyramid framework application from inside another application从另一个应用程序内部调用金字塔框架应用程序
【发布时间】:2016-12-06 07:53:25
【问题描述】:

我有一个 Python 应用程序在一个框架中运行,该框架驱动网络协议来控制远程设备。现在我想添加一个基于浏览器的监控和控制,我正在寻找 Pyramid 框架来构建它。

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

这是 Pyramid 的实际用例,还是我应该寻找其他一些基于 WSGI 的框架来执行此操作?

【问题讨论】:

    标签: python python-3.x pyramid wsgi


    【解决方案1】:

    WSGI 应用程序基本上是一个接收一些输入并返回响应的函数,您实际上并不需要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 调用是阻塞,即程序在该行停止,直到你点击Ctrl-C kbd> 并停止脚本。这使得让您的程序“驱动网络协议以控制远程设备”并同时提供网页服务变得有点不重要(这与其他基于事件的平台不同,例如 Node.js,它是微不足道的有两台服务器在同一个进程中监听不同的端口)。

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

    【讨论】:

    • 单独的线程似乎并不难。 ini 文件中的所有内容都可以通过 Configurator() 中的函数进行控制吗?
    • 嗯,启动一个线程确实不难。不过,对“宿主应用程序对象”的并发访问可能(也可能不需要)需要一些技巧。
    • 关于 Configurator() 与 .ini - Configurator 可以配置 Pyramid 应用程序,但是,Paste 可以使用 .ini 文件来组装一些 WSGI 应用程序堆栈或所有这些都可能不是 Pyramid 应用程序。例如,您可以同时运行 Pyramid 应用、Django 应用和 Flask 应用。
    猜你喜欢
    • 2013-06-26
    • 1970-01-01
    • 1970-01-01
    • 2015-08-21
    • 2016-07-21
    • 1970-01-01
    • 1970-01-01
    • 2016-04-21
    • 1970-01-01
    相关资源
    最近更新 更多