我试图用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

我错过什么了吗?内容长度是否可能有误?我还缺少其他标题吗?

谢谢你.

推荐答案

对于这个目的来说,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

GZip使用zlib,但zlib本身产生的内容编码不正确,浏览器将"GZip"视为内容编码.希望有帮助!

Django相关问答推荐

带有变量键的 Django 模板括号表示法不起作用

如何访问 django 模板中的字典值?

如何在 Django 测试中发送带有图像字段查询参数的 POST 请求

Django 获取用户创建的对象,这些用户属于用户列表

如何计算 Django 模型中特定对象的数量?

data._mutable= 在 Django REST 框架中为真

如何让 Django 在模板更改时重新启动运行服务器?

使用 Django 和 South 重命名应用程序

使用移动应用程序保护通信 [真实性、隐私和完整性]?

Django:将原始html(来自数据库)显示为html,而不是呈现

Python 和 Django OperationalError (2006, 'MySQL server has gone away')

virtualenv(python3.4), pip install mysqlclient 错误

是否可以将 FastAPI 与 Django 一起使用?

Django:使用 ModelForm 编辑现有数据库条目

如何从 django 的 db 模型中获取字段类型字符串

如何创建一个在复选框右侧显示复选框标签的 Django 表单?

Python 社区里的小马是怎么回事?

settings.DATABASES 配置不正确使用 django 1.4 执行 syncdb 时出错

您如何在本地针对 OpenID 进行开发

Django:必须使用对象 pk 或 slug 调用通用详细视图