Python 使用CherryPy/Cherryd启动多个Flask实例

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

根据SO/SF和其他站点的建议,我使用CherryPy作为WSGI服务器来启动我用Flask构建的Python web服务器的多个实例。每个实例都在自己的端口上运行,并位于Nginx后面。我应该注意到下面的内容确实对我有用,但我很困扰,因为我做事的方式不对,而且它是“偶然”起作用的

这是我当前的cherrypy.conf文件:

[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
问题包括:

  • 在CherryPy内包裹烧瓶仍然是生产中使用烧瓶的首选方法吗

  • 这是使用.conf文件启动CherryPy并导入Flask应用程序的正确方法吗?我已经浏览了CherryPy文档,但是我找不到任何与我在这里具体尝试做的事情相匹配的用例

  • 在一台机器上启动多个CherryPy/Flask实例以执行多个cherryd命令(使用-d进行Daemoning,等等)的正确方法是为每个要使用的端口(8891、8892等)使用唯一的.conf文件吗?还是有更好的“樱桃味”方法来实现这一点


  • 谢谢你的帮助和见解。

    我不能代表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 as
    cherryd-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'