2015-04-23 2 views
5

Мне было интересно: можно было бы сжать полезную нагрузку ответа в Django REST?Сжатие полезной нагрузки отклика в Django REST?

В настоящий момент полезная нагрузка для ответа представляет собой простые данные JSON. Тем не менее, есть много данных для отскока назад и вперед, поэтому мне было интересно, поможет ли сжатие данных с проблемами пропускной способности.

ответ

7

Сжатие HTTP-ответа, скорее всего, не будет обрабатываться Django, а вашим HTTP-сервером с использованием алгоритмов gzip или deflate.

Вам нужно только убедиться, что ваш HTTP-сервер настроен на сжатие HTTP-ответов с заголовком Content-Type, установленным на application/json.

Как включить Gzip сжатие Nginx: https://rtcamp.com/tutorials/nginx/enable-gzip/

+0

Обязательно рассмотрите компромисс производительности дополнительного CPU/latency для выполнения сжатия. –

+0

@ dwightgunning Знаете ли вы какую-нибудь бумагу, которая даст подсказки? – aumo

+0

http://tweaked.io/guide/nginx/ описывает компромисс. Пока у вас есть запас процессора, вы должны быть в порядке. Просто выберите что-то здравомыслящее и перейдите ;-) –

1

Следующие работал для меня.

Я фактически превратил gzip на уровне nginx, а не в Django или Django Rest Framework.

/etc/nginx/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; 
    } 

Это оставляет сжатия до сервера Nginx и так как большинство современных браузеров автоматически знают, как извлечь (распаковывать) сжатие GZIP, я не сделал нужно делать что-либо на моей стороне клиента - даже при получении json-данных в приложении Angular spa.

My 1.3 MB полезная нагрузка JSON превратилась в полезную нагрузку 180 КБ.

Очень быстрый и быстрый способ сохранения данных МБ.

0

Если вы используете встроенный веб-сервер Django/DRF, а не Apache или nginx, который использует собственный WSGI-сервер, поэтому эти методы не будут работать для вас.

Однако, Django имеет встроенный GZIP промежуточного слоя, который вы должны быть в состоянии использовать, как описано в этих ответах:

https://stackoverflow.com/a/1864377/2540707
https://stackoverflow.com/a/14821684/2540707

Это, как говорится, для производства использовать вы должны используйте реальный веб-сервер, а не встроенный Django.