2012-08-22 70 views
4

如果我在安装CherryPy的静态目录,如下所示:从该目录为什么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添加到请求的头文件(例如范围头文件和内容长度)不会在响应中返回 - 我必须自己做。

我能做些什么来使第一种方法更快?

+1

CherryPy不只是像Flask这样的开发服务器吗?对于Flask,推荐使用像Nginx这样的*真实*网络服务器来提供静态文件,并使用'uwsgi'或类似的东西与CherryPy进行交互。 – Blender

+1

我认为Blenders建议适用于生产环境中的任何Python应用程序。即使是小型网站也是一个很好的设计,因为稍后可以更容易地从CDN提供静态文件。 –

+0

@Blender它没有。至少它是[作者认为](http://stackoverflow.com/a/3441801/2072035)。另外WSGI不是必需的,因为CherryPy很好地服务于HTTP服务器角色。尽管我不得不承认,让Nginx在前面总是给路由,静态内容,SSL等提供更多的灵活性。 – saaj

回答

2

我以前有过这个相同的问题,虽然只有在Windows机器上,我记得。你在Windows上运行CherryPy吗? CherryPy 3.5.0中似乎存在一个错误,它会为静态文件返回错误的Content-Length头,这会导致浏览器空闲地等待更多不存在的字节。

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