11

根据 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

问题是:

  1. 在 CherryPy 中包装 Flask 仍然是在生产中使用 Flask 的首选方法吗? https://stackoverflow.com/questions/4884541/cherrypy-vs-flask-werkzeug

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

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

感谢您的帮助和洞察力。

4

2 回答 2

5

我不能代表 Flask,但我可以代表 CherryPy。这看起来像“正确的方式”......主要是。关于 MethodDispatcher 的那一行是无操作的,因为它只影响 CherryPy 应用程序,而且您似乎没有安装任何应用程序(只是一个 Flask 应用程序)。

关于第3点,你说得对。CherryPy 允许您在同一进程中运行多个 Server 对象以侦听多个端口(或协议),但它没有任何用于启动多个进程的糖。正如您所说,具有不同配置文件的多个cherryd命令是如何做到的(除非您想使用更集成的集群/配置管理工具,例如eggmonster)。

于 2011-05-13T06:17:38.167 回答
3

术语:安装与嫁接

原则上,这是通过cherrypy服务烧瓶应用程序的正确方法,只是对您的命名的快速说明:

值得注意的是,它tree.mount本身不是配置键 -tree将导致cherrypy._cpconfig._tree_config_handler(k, v)使用参数调用'mount', {'/': my_flask_server.app}

key 参数根本不使用,_tree_config_handler因此在您的配置中“mount”只是该特定路径映射字典的任意标签。它也不会“挂载”应用程序(毕竟它不是 CherryPy 应用程序)。我的意思是,它不是cherrypy.tree.mount(…)它,而是cherrypy.tree.graft一个任意的 WSGI 处理程序到您的“脚本名称”(路径,但在 CherryPy 术语中)命名空间。

Cherrypy 的日志消息有些误导性地说“Mounted <app as string> on /”]

这一点很重要,因为与 mount 不同,graft 无法指定更多选项,例如为您的应用程序指定静态文件服务或该路径上的流式响应。

因此,我建议将配置键更改为描述性的内容,不会因为该配置而导致tree.mount阅读过多关于 CherryPy 中发生的事情的语义(因为有方法cherrypy.tree.mount)。例如,tree.flask_app_name如果您只是在该字典中映射一个应用程序(可能有许多tree指令,所有指令都只是合并到路径命名空间中),或者tree.wsgi_delegates如果您在该字典中映射许多应用程序。

使用 CherryPy 提供附加内容,而无需制作应用程序

另一个注意事项,如果您希望cherrypy 例如为您的应用程序提供静态文件服务,您不必创建样板cherrypy 应用程序来保存该配置。您只需要None使用适当的附加配置进行安装。如果将以下文件放入启动cherryd以提供静态内容的目录中(调用cherryd为cherryd -c cherrypy.conf -i my_flask_server -i static

静态的.py

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'
于 2013-05-23T08:39:58.087 回答