【发布时间】:2012-08-18 08:28:12
【问题描述】:
如果我在 CherryPy 中挂载一个静态目录,像这样:
wwwroot_config = { '/':
{ 'tools.staticdir.on': True,
'tools.staticdir.dir': '/path/to/dir' } }
cherrypy.tree.mount(root, '/', config = wwwroot_config)
从该目录下载文件的速度很慢。
但是,如果我创建自己的 WSGI 应用程序...
self.wsgi_server = wsgiserver.CherryPyWSGIServer((self.bindaddress, self.port), self.download_file, numthreads = 1)
self.download_file 包含,基本上:
return serve_file(theFile, "application/x-download", "attachment", os.path.basename(theFile), debug = True)
我的速度快了 4-5 倍。
但是,这种方式不够灵活,因为 serve_file 添加到请求的标头(例如范围标头和内容长度)不会在响应中返回 - 我必须自己做。
有什么办法可以让第一种方式更快吗?
【问题讨论】:
-
CherryPy 不是像 Flask 那样只附带一个开发服务器吗?对于 Flask,建议使用像 Nginx 这样的真正的网络服务器来提供静态文件,并使用
uwsgi或类似的东西与 CherryPy 交互。 -
我认为 Blenders 的建议对生产环境中的任何 Python 应用程序都有效。即使对于小型网站来说,这也是一个很好的设计,因为它使以后从 CDN 提供静态文件变得更加容易。
-
@Blender 它没有。至少它是what the author thinks。也不需要 WSGI,因为 CherryPy 很好地服务于 HTTP 服务器角色。虽然我不得不承认,将 Nginx 放在前面总是在路由、提供静态内容、SSL 等方面提供更大的灵活性。