Django Apache在响应gzip请求时会延迟
对于我正在开发的应用程序,用户使用多部分表单数据(内容类型:multipart/formdata)提交一个GZIP HTTP POST请求(内容编码:GZIP)。我使用mod_deflate作为一个输入过滤器来解压,web请求通过mod_wsgi在Django中处理 一般来说,一切都很好。但对于某些请求(确定性),从请求到响应几乎有一分钟的延迟。调查显示,django中的处理立即完成,但服务器的响应暂停。如果请求没有经过gzip处理,那么一切都可以正常工作 注意,为了处理mod_wsgi中的一个小问题,我将content length设置为未压缩的mesage大小Django Apache在响应gzip请求时会延迟,django,apache,gzip,mod-wsgi,mod-deflate,Django,Apache,Gzip,Mod Wsgi,Mod Deflate,对于我正在开发的应用程序,用户使用多部分表单数据(内容类型:multipart/formdata)提交一个GZIP HTTP POST请求(内容编码:GZIP)。我使用mod_deflate作为一个输入过滤器来解压,web请求通过mod_wsgi在Django中处理 一般来说,一切都很好。但对于某些请求(确定性),从请求到响应几乎有一分钟的延迟。调查显示,django中的处理立即完成,但服务器的响应暂停。如果请求没有经过gzip处理,那么一切都可以正常工作 注意,为了处理mod_wsgi中的一个
有人遇到过这个问题吗?有没有一种方法可以在apache处理响应时轻松调试它?您认为mod_wsgi中存在什么问题 问题的一个简单事实是WSGI 1.0不支持改变请求内容长度的输入过滤器。因此,从技术上讲,在使用WSGI 1.0时,不能在Apache中使用mod_deflate作为请求内容。将内容长度设置为实际大小以外的值很可能会阻塞mod_deflate的操作 如果您希望能够处理压缩的请求内容,则需要跳出WSGI 1.0规范并使用非标准代码 我建议您阅读一下: 这就解释了这个问题以及关于它的建议 我非常建议您将这个问题提交给官方讨论,讨论如何编写代码。但是,如果您使用的是一个Python框架,那么您可能会受到限制,因为它们将实现WSGI 1.0,而您无法做到这一点
更新1 通过对mod_wsgi列表的讨论,原始wsgi应用程序应该包装在以下wsgi中间件中。这只适用于WSGI适配器,这些适配器实际上提供了一个空字符串作为输入的结束哨兵,WSGi1.0不需要这样做。这可能只用于小型上传,因为所有内容都被读入内存。如果需要大量的压缩上传,那么当数据累积时,应该将其写入一个文件
class Wrapper(object):
def __init__(self, application):
self.__application = application
def __call__(self, environ, start_response):
if environ.get('HTTP_CONTENT_ENCODING', '') == 'gzip':
buffer = cStringIO.StringIO()
input = environ['wsgi.input']
blksize = 8192
length = 0
data = input.read(blksize)
buffer.write(data)
length += len(data)
while data:
data = input.read(blksize)
buffer.write(data)
length += len(data)
buffer = cStringIO.StringIO(buffer.getvalue())
environ['wsgi.input'] = buffer
environ['CONTENT_LENGTH'] = length
return self.__application(environ, start_response)
application = Wrapper(original_wsgi_application_callable)
至于这个小问题,我们在前面已经讨论过了:我认为您的评论意味着我应该将内容长度设置为未压缩的消息大小。到目前为止,这样做一直很有效。。。不管怎样,我在mod_wsgi列表上问过。感谢您的帮助。有关mod_wsgi列表的讨论位于“”。