Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/apache/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Django Apache在响应gzip请求时会延迟_Django_Apache_Gzip_Mod Wsgi_Mod Deflate - Fatal编程技术网

Django Apache在响应gzip请求时会延迟

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中的一个

对于我正在开发的应用程序,用户使用多部分表单数据(内容类型:multipart/formdata)提交一个GZIP HTTP POST请求(内容编码:GZIP)。我使用mod_deflate作为一个输入过滤器来解压,web请求通过mod_wsgi在Django中处理

一般来说,一切都很好。但对于某些请求(确定性),从请求到响应几乎有一分钟的延迟。调查显示,django中的处理立即完成,但服务器的响应暂停。如果请求没有经过gzip处理,那么一切都可以正常工作

注意,为了处理mod_wsgi中的一个小问题,我将content length设置为未压缩的mesage大小


有人遇到过这个问题吗?有没有一种方法可以在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列表的讨论位于“”。