Python 使用CherryPy/Cherryd启动多个Flask实例
根据SO/SF和其他站点的建议,我使用CherryPy作为WSGI服务器来启动我用Flask构建的Python web服务器的多个实例。每个实例都在自己的端口上运行,并位于Nginx后面。我应该注意到下面的内容确实对我有用,但我很困扰,因为我做事的方式不对,而且它是“偶然”起作用的 这是我当前的cherrypy.conf文件:Python 使用CherryPy/Cherryd启动多个Flask实例,python,nginx,cherrypy,flask,werkzeug,Python,Nginx,Cherrypy,Flask,Werkzeug,根据SO/SF和其他站点的建议,我使用CherryPy作为WSGI服务器来启动我用Flask构建的Python web服务器的多个实例。每个实例都在自己的端口上运行,并位于Nginx后面。我应该注意到下面的内容确实对我有用,但我很困扰,因为我做事的方式不对,而且它是“偶然”起作用的 这是我当前的cherrypy.conf文件: [global] server.socket_host = '0.0.0.0' server.socket_port = 8891 request.dispatch: c
[global]
server.socket_host = '0.0.0.0'
server.socket_port = 8891
request.dispatch: cherrypy.dispatch.MethodDispatcher()
tree.mount = {'/':my_flask_server.app}
在不深入我的Flask服务器的情况下,它是如何启动的:
import flask
app = flask.Flask(__name__)
@app.route('/')
def hello_world():
return "hello"
下面是我在命令行上发布的命令,用于与Cherryd一起启动:
cherryd -c cherrypy.conf -i my_flask_server
问题包括:
谢谢你的帮助和见解。我不能代表Flask说话,但我可以代表CherryPy说话。这看起来是“正确的方式”…大多数情况下。关于MethodDispatcher的那句话是没有用的,因为它只影响CherryPy应用程序,而您似乎没有安装任何应用程序(只安装了一个Flask应用程序) 关于第三点,你说得对。CherryPy允许您在同一进程中运行多个服务器对象,以便侦听多个端口(或协议),但它没有启动多个进程的能力。正如您所说,使用不同配置文件的多个cherryd命令是如何做到这一点的(除非您想使用更集成的群集/配置管理工具,如)。术语:装载与安装 原则上,这是通过cherrypy为flask应用程序提供服务的一种适当方式,只需简单说明一下您的命名: 这里值得注意的是,
tree.mount
本身并不是一个配置键-tree
将导致cherrypy.\u cpconfig.\u tree\u config\u handler(k,v)
被参数调用'mount',{'/':my\u flask\u server.app}
\u tree\u config\u处理程序根本不使用键参数,因此在配置中,“mount”只是特定路径映射的任意标签。它也不会“挂载”应用程序(毕竟它不是CherryPy应用程序)。我的意思是,它不是cherrypy.tree.mount(…)
it,而是cherrypy.tree.graft
s将任意WSGI处理程序移植到您的“脚本名称”(路径,但用cherrypy术语)命名空间上
Cherrypy的日志信息有点误导性地说“挂载于/”]
这一点有些重要,因为与mount不同,使用graft时,您无法指定进一步的选项,例如应用程序的静态文件服务或该路径上的流式响应
因此,我建议将tree.mount
config键更改为描述性键,这样就不会因为该配置而导致阅读太多关于CherryPy中发生的事情的语义(因为存在CherryPy.tree.mount
方法)。例如,tree.flask\u app\u name
如果您只是映射该dict中的一个应用程序(可以有许多tree
指令,所有这些指令都只是合并到路径命名空间中),或者tree.wsgi\u委托
如果您映射该dict中的多个应用程序
使用CherryPy提供附加内容,而不制作应用程序
另一方面,如果您希望cherrypy(例如)为您的应用程序提供静态文件服务,则不必创建样板cherrypy应用程序来保存该配置。您只需使用适当的附加配置装载None
。如果将以下文件放入启动cherryd以提供静态内容的目录中(调用cherryd ascherryd-c CherryPy.conf-i my_flask\u server-i static
),则可以让CherryPy提供子目录“static”中的静态内容:
静态.py
static.conf
import cherrypy
# next line could also have config as an inline dict, but
# file config is often easier to handle
cherrypy.tree.mount(None, '/static-path', 'static.conf')
# static.conf
[/]
tools.staticdir.on = True
tools.staticdir.root = os.getcwd()
tools.staticdir.dir = 'static'
tools.staticdir.index = 'index.html'