Прежде всего, я должен подчеркнуть, что вы должны делать это на уровне веб-сервера (nginx или apache).Для этого есть несколько причин:
Производительность - если вы делаете это в Python, вы используете один из ваших потоков, который может обрабатывать запросы на сжатие, интенсивно использующее процессор.Это гораздо менее эффективно, чем позволить оптимизированному веб-серверу обрабатывать его.
Блокировка - большинство промежуточного программного обеспечения GZip блокирует ваши ответы, буферизуя тело, чтобы оно могло сжать весь ответ.Это огромная проблема, если вы пытаетесь перенаправить любой ответ обратно клиенту, потому что он попадет в промежуточное ПО.На самом деле это нарушение PEP333, спецификации WSGI.
Учитывая все это, возможно, имеет смысл сделать это на Python хотя бы для целей отладки во время разработки.
Поскольку вы уже используете Pyramid, значит, у вас установлен Paste.Таким образом, вы можете просто добавить paste.gzipper.GzipMiddleware
в конвейер вашего приложения следующим образом:
[filter:gzip]
use = egg:Paste#gzip
compress_level = 6
[pipeline:main]
pipeline =
gzip
app
Очевидно, что если вы не хотите менять уровень сжатия по умолчанию на 6, вы можете просто добавить egg:Paste#gzip
в конвейер вместо настройки фильтра и присвоения ему произвольного имени (gzip
).