【问题标题】:Why are CherryPy static file downloads so slow?为什么 CherryPy 静态文件下载这么慢?
【发布时间】: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 等方面提供更大的灵活性。

标签: python wsgi cherrypy


【解决方案1】:

我以前也遇到过同样的问题,尽管我记得只在 Windows 机器上。你在 Windows 上运行 CherryPy 吗? CherryPy 3.5.0 中似乎存在一个错误,它为静态文件返回错误的 Content-Length 标头,这导致浏览器闲置等待更多不存在的字节。

我没有详细研究过这个问题,但是您可能想检查服务器发送的 Content-Length 标头,看看它是否与静态文件的实际大小匹配。临时解决方法可能是手动设置(或删除)“before_handler”挂钩中的 Content-Length 标头。

【讨论】:

    猜你喜欢
    • 2020-11-14
    • 1970-01-01
    • 2011-08-05
    • 1970-01-01
    • 2021-07-22
    • 2013-03-15
    • 2021-09-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多