2009-06-05 47 views
32

我想在Django服務gzip版本的文本/ html頁面,但Firefox告訴我有一個內容編碼錯誤。從Django服務gzipped內容

注:

  • 我知道這是不是最好的做法,我很可能要使用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 

我在這裏失去了一些東西?內容長度是否有可能錯誤?是否有額外的標題我錯過了?

謝謝。

+1

順便說一句...如果你使用Apache 2.x的,必須在mod_deflate模塊一眼......這是一個有點比mod_zip更先進。 – 2009-06-05 20:05:04

回答

22

zlib爲此目的太低級別。下面是gzip的中間件本身是怎麼做的(見compress_string在django.utils.text.py):

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的」爲內容編碼內容。希望有所幫助!

71

你也可以簡單地使用Django的gzip的中間件:

無論是通過啓用settings.py中間件加入:

MIDDLEWARE_CLASSES = (
django.middleware.gzip.GZipMiddleware, 
... 

) 

還是去做了,你返回一個特定的響應之前。在你的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 
+6

+1這應該是答案 – shabeer90 2013-07-24 08:58:24

+2

請注意有關gzip中間件的當前安全警告:https://docs.djangoproject.com/en/1.9/ref/middleware/#module-django.middleware.gzip – 2016-02-03 23:05:35

0

爲他人着想發現了這個問題,誰使用nginx的,這太爲我工作:

https://stackoverflow.com/a/41820704/4533488

基本上在開啓的gzip /etc/nginx/nginx.conf文件爲我做了所有的壓縮處理。在客戶端,大多數現代瀏覽器在接收數據時自動處理提取(解壓縮)數據 - 甜蜜!

這裏是nginx.conf文件設置:

http { 

     #... other settings ...# 

     ## 
     # Gzip Settings 
     ## 

     gzip on; 
     gzip_disable "msie6"; 

     gzip_vary on; 
     gzip_proxied any; 
     gzip_comp_level 6; 
     gzip_buffers 16 8k; 
     gzip_http_version 1.1; 
     gzip_types text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript; 
    }