如何使用cherrypy tree.mount指定侦听服务器实例?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何使用cherrypy tree.mount指定侦听服务器实例?相关的知识,希望对你有一定的参考价值。

让我们创建一个应用程序服务器和一个管理服务器。假设fusionListeneradminListener包含我们要公开的应用程序和管理逻辑。

  from cherrypy._cpserver import Server
  fserver = Server()
  fserver.socket_port = 10000
  fserver.subscribe()

  aserver = Server()
  aserver.socket_port = 10001
  aserver.subscribe()

然后启动它们:

cherrypy.engine.start()
cherrypy.engine.block()

tree.mount参数要求:

  • 将代码/业务逻辑作为第一个参数
  • 收听网址
  • 配置参数

这是上述服务器的外观:

  cherrypy.tree.mount(fusionListener, r"/fusion.*",fusionConf)
  cherrypy.tree.mount(adminListener, r"/admin.*",adminConf)

但是server本身的参数在哪里-其中包括正在监听的port

答案

这不是CherryPy的良好支持案例。

应用程序选择(cherrypy.tree本质上是/ path-> App的映射)在请求分配之前完成,并且...长话短说,您could使用cherrypy.dispatch.VirtualHost并在下面映射您的子应用程序一个主要的(根据主机名(端口可以是端口的一部分)进行路由)。可以侦听多个端口,但这又是一个非常自定义的安排。

我希望这个例子说明了制作这种feat:]的可能方法。

import cherrypy

from cherrypy import dispatch
from cherrypy._cpserver import Server


class AppOne:

    @cherrypy.expose
    def default(self):
        return "DEFAULT from app ONE!"

    @cherrypy.expose
    def foo(self):
        return "FOO from app ONE"


class AppTwo:

    @cherrypy.expose
    def default(self):
        return "DEFAULT from app TWO!"

    @cherrypy.expose
    def foo(self):
        return "FOO from app TWO"


class Root:

    def __init__(self):
        self.one = AppOne()
        self.two = AppTwo()


def bind_two_servers(app_one_port, app_two_port):
    # unsubscribe the default server
    cherrypy.server.unsubscribe()
    s1 = Server()
    s2 = Server()
    s1.socket_port = app_one_port
    s2.socket_port = app_two_port
    # subscribe the server to the `cherrypy.engine` bus events
    s1.subscribe()
    s2.subscribe()


def start_server():
    bind_two_servers(8081, 8082)
    cherrypy.engine.signals.subscribe()
    cherrypy.engine.start()
    cherrypy.engine.block()


config = 
    '/': 
        'request.dispatch': dispatch.VirtualHost(**
            'localhost:8081': '/one',
            'localhost:8082': '/two',
        )
    


cherrypy.tree.mount(Root(), '/', config)
start_server()

此示例从AppOne发出时将服务localhost:8081,从AppTwo发出时将服务localhost:8082

问题是您无法执行cherrypy.tree.mount的倍数运算,并希望使用VirtualHost调度程序路由到不同的应用程序,它假定应用程序解析已在该点完成,并且仅解决了该应用程序的路径。

说了这么多...我不推荐这种解决方案,它可能会变得很复杂,最好在前面安装一些其他服务器(例如nginx),并在不同的进程上服务每个路径。仅当您确实really

想要避免设置中有任何额外的服务器或进程时,这才是替代方法。

以上是关于如何使用cherrypy tree.mount指定侦听服务器实例?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 CherryPy 的 POST 请求中接收 JSON?

如何从一个简单的网络应用程序中注销。在 CherryPy,Python

如何从运行尽可能快的 CherryPy BackgroundTask 返回数据

部署 CherryPy(守护进程)

如何将 StringTemplate 引擎集成到 CherryPy Web 服务器中

使用cherrypy流式传输文件