从django提供gzip压缩内容

pjb*_*ley 39 django gzip http

我正在尝试在Django中提供文本/ html页面的gzip压缩版本,但Firefox告诉我存在内容编码错误.

笔记:

  • 我意识到这不是最佳实践,我很可能会使用mod_gzip.这只是一个学习练习,以了解正在发生的事情.
  • 我知道Django gzip中间件 - 它有二进制文件的问题.

这是我的代码:

rendered_page =  zlib.compress(template.render(context).encode('utf-8'))

response = HttpResponse(rendered_page)
response['Content-Encoding'] = 'gzip'
response['Content-Length'] = len(rendered_page)
return response
Run Code Online (Sandbox Code Playgroud)

我在这里错过了什么吗?内容长度是否有可能错误?我还缺少额外的标题吗?

谢谢.

And*_*res 86

你也可以简单地使用django的gzip中间件:

通过添加以下内容在settings.py中启用中间件:

MIDDLEWARE_CLASSES = (
    django.middleware.gzip.GZipMiddleware,
    ...
)
Run Code Online (Sandbox Code Playgroud)

或者在返回特定回复之前执行此操作.在views.py中,dec将是某个url的处理程序

from django.middleware.gzip import GZipMiddleware

gzip_middleware = GZipMiddleware()

 def dec(request, *args, **kwargs):
        response = func(request, *args, **kwargs)
        return gzip_middleware.process_response(request, response)
        return dec
Run Code Online (Sandbox Code Playgroud)

  • 请注意有关gzip中间件的当前安全警告:https://docs.djangoproject.com/en/1.9/ref/middleware/#module-django.middleware.gzip (3认同)
  • @hd1您应该使用字符串来指定中间件类,而不是类/模块本身。因此,您应该这样做,而不是`MIDDLEWARE_CLASSES = [django.middleware.gzip.GZipMiddleware,]`:`MIDDLEWARE_CLASSES = ["django.middleware.gzip.GZipMiddleware",]` (2认同)

Jar*_*die 24

zlib为此目的有点太低级了.以下是GZip中间件本身的用法(请参阅django.utils.text.py中的compress_string):

import cStringIO, gzip
zbuf = cStringIO.StringIO()
zfile = gzip.GzipFile(mode='wb', compresslevel=6, fileobj=zbuf)
zfile.write(template.render(context).encode('utf-8'))
zfile.close()

compressed_content = zbuf.getvalue()
response = HttpResponse(compressed_content)
response['Content-Encoding'] = 'gzip'
response['Content-Length'] = str(len(compressed_content))
return response
Run Code Online (Sandbox Code Playgroud)

GZip使用zlib,但是它自己的zlib产生的内容不正确地编码为浏览器,看到'gzip'作为内容编码.希望有所帮助!


小智 23

如果您正在抓取单页而不是所有页面,则可以使用gzip_page装饰器而不是GzipMiddleware.

from django.views.decorators.gzip import gzip_page

@gzip_page
def viewFunc(request):
  return HttpResponse("hello"*100)
Run Code Online (Sandbox Code Playgroud)

参考这里:https://docs.djangoproject.com/en/1.4/topics/http/decorators/#module-django.views.decorators.gzip