我正在尝试在Django中提供文本/ html页面的gzip压缩版本,但Firefox告诉我存在内容编码错误.
笔记:
这是我的代码:
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)
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
| 归档时间: |
|
| 查看次数: |
23880 次 |
| 最近记录: |