42

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

ここで何か不足していますか?コンテンツの長さが間違っている可能性はありますか? 不足している追加のヘッダーはありますか?

ありがとう。

4

6 に答える 6

96

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

注:GZipミドルウェアを使用する前に、サイドチャネル攻撃を受けていないことを確認する必要があります。

警告

セキュリティ研究者は最近、圧縮技術(GZipMiddlewareを含む)がWebサイトで使用されると、サイトが多くの攻撃の可能性にさらされる可能性があることを明らかにしました。サイトでGZipMiddlewareを使用する前に、これらの攻撃を受けているかどうかを慎重に検討する必要があります。影響を受けているかどうか疑問がある場合は、GZipMiddlewareの使用を避ける必要があります。詳細については、BREACHペーパー(PDF)およびbreachattack.comを参照してください。

また:

Django 1.10で変更:古いバージョンでは、圧縮が使用された場合、DjangoのCSRF保護メカニズムはBREACH攻撃に対して脆弱でした。これはもはや当てはまりませんが、この方法で自分の秘密を危険にさらさないように注意する必要があります。

于 2009-12-08T03:28:26.820 に答える
28

すべてのページではなく、単一のページを gzip する場合は、 GzipMiddleware の代わりにgzip_pageデコレータを使用できます。

from django.views.decorators.gzip import gzip_page

@gzip_page
def viewFunc(request):
  return HttpResponse("hello"*100)

ここを参照してください: https://docs.djangoproject.com/en/1.4/topics/http/decorators/#module-django.views.decorators.gzip

于 2013-02-11T22:00:40.110 に答える
26

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」を参照するブラウザに対して不適切にエンコードされたコンテンツを生成します。それが役立つことを願っています!

于 2009-06-05T19:57:02.320 に答える
1

でデータを圧縮する場合は、 ではなくzlibに設定Content-Encodingする必要があります。deflategzip

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

response = HttpResponse(rendered_page)
response['Content-Encoding'] = 'deflate'
response['Content-Length'] = len(rendered_page)
return response

コンテンツ エンコーディング

(...)

空気を抜く

deflate 圧縮アルゴリズム (RFC 1951 で定義) で zlib 構造 (RFC 1950 で定義) を使用する。

于 2019-02-15T12:38:30.377 に答える