如何使用cherrypy tree.mount指定侦听服务器实例?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何使用cherrypy tree.mount指定侦听服务器实例?相关的知识,希望对你有一定的参考价值。
让我们创建一个应用程序服务器和一个管理服务器。假设fusionListener
和adminListener
包含我们要公开的应用程序和管理逻辑。
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 返回数据