Python 使用cherrypy压缩流式输出
我使用cherrypy作为web服务器,它能够对某些方法的输出进行流式处理。 服务器使用Python 使用cherrypy压缩流式输出,python,ajax,gzip,cherrypy,http-streaming,Python,Ajax,Gzip,Cherrypy,Http Streaming,我使用cherrypy作为web服务器,它能够对某些方法的输出进行流式处理。 服务器使用yield发送数据行,客户端使用onprogress事件的$.ajax方法 但是启用cherrypy的'tools.gzip'配置会导致客户端无法缓存输出。事实上,除非服务器方法完全完成,否则不会调用客户端的onprogress事件。cherrypy压缩工具似乎无法在流模式下压缩输出(它只能在完全获取输出时压缩输出) 现在我的第一个问题是如何解决这个问题。如果无法修复,我的第二个问题是如何为特定方法禁用che
yield
发送数据行,客户端使用onprogress
事件的$.ajax
方法但是启用cherrypy的'tools.gzip'配置会导致客户端无法缓存输出。事实上,除非服务器方法完全完成,否则不会调用客户端的
onprogress
事件。cherrypy压缩工具似乎无法在流模式下压缩输出(它只能在完全获取输出时压缩输出)现在我的第一个问题是如何解决这个问题。如果无法修复,我的第二个问题是如何为特定方法禁用cherrypy压缩。您必须启用请求的流功能 设置以下配置:
{'response.stream':True}
gzip工具检查当前请求并查找流
并相应地响应
有关详细信息:已使用
response.stream
配置对请求进行流式传输。问题在于流媒体和gzip功能的结合。你说得对。显然,gzip工具不支持流式传输。明天早上我将进一步了解细节。在对gzip工具进行了一些检查之后,它似乎确实应该与流媒体一起工作。它返回一个生成器。尝试启用调试,并查看日志中是否有有用的内容tools.gzip.debug:True
!我检查源代码。在位于encoding.py
文件的compress
方法中,有一个for
循环,它使用zobj
逐行压缩身体,并产生每一行压缩的结果。循环完成后,将生成zobj.flush()
。跟踪代码时,我发现for
返回一个空字符串!但是for
的收益率会立即返回整个数据!!换句话说,实际上,您提到的生成器没有按预期工作。