#gzip #cherrypy #yslow
#gzip #cherrypy #yslow
Вопрос:
Я просматриваю свой сайт разработки с помощью инструмента Yslow в Chrome и Firefox, и одно из предложений заключается в том, чтобы заархивировать соответствующий контент. В качестве отправной точки я просто добавил «tools.gzip.on = True» в свою конфигурацию [/]. Я знаю, что файл конфигурации и блок обрабатываются правильно, потому что я также добавил опции для отключения кэширования в заголовках ответов, поскольку я часто меняю файлы по мере разработки сайта. В моих ответах я вижу заголовки «Expires» и «Pragma: no-cache».
По какой-то причине, даже после изменения файла конфигурации (и перезапуска процесса, что не является строго необходимым), Yslow по-прежнему сообщает, что я не использую gzip. Я также использовал wget и не вижу заголовка Content-Encoding.
Кто-нибудь может подсказать, как еще я мог бы проверить, что происходит? Мне интересно, является ли проблема в том, что cherrypy игнорирует настройку gzip, или Yslow просто неправильно интерпретирует факты. У меня никогда раньше не было проблем с Yslow, поэтому я склоняюсь к первому.
Я добавлю, что Yslow сообщает только о том, что мои внешние файлы CSS и JavaScript (обслуживаемые тем же процессом cherrypy) должны быть сжаты, хотя заголовки, показанные «wget -S», не отображают кодировку gzip даже на самой главной странице (которая является динамическим содержимым).
Я попытался добавить «tools.gzip.on = True» в мои блоки [/ css] и [/ js], и я также попытался установить «tools.encode.on = True» во всех тех же блоках, думая, что, возможно, кодирование должно быть включено для работы gzip.
Заранее спасибо.
Ответ №1:
Строка документации 3.2 для cherrypy.lib.gzip:
def gzip(compress_level=5, mime_types=['text/html', 'text/plain'], debug=False):
"""Try to gzip the response body if Content-Type in mime_types.
cherrypy.response.headers['Content-Type'] must be set to one of the
values in the mime_types arg before calling this function.
The provided list of mime-types must be of one of the following form:
* type/subtype
* type/*
* type/* subtype
No compression is performed if any of the following hold:
* The client sends no Accept-Encoding request header
* No 'gzip' or 'x-gzip' is present in the Accept-Encoding header
* No 'gzip' or 'x-gzip' with a qvalue > 0 is present
* The 'identity' value is given with a qvalue > 0.
"""
Я ставлю на MIME-тип, поскольку вы упомянули JS и CSS. Вы можете изменить это таким образом:
[/static]
tools.gzip.mime_types: ['text/html', 'text/plain', 'text/javascript', 'text/css']
В CherryPy 3.2 это можно сократить до:
[/static]
tools.gzip.mime_types: ['text/*']
Комментарии:
1. Я использую CherryPy 3.1.2, сборку, которая поставляется с Fedora 14. Я добавил это в свой блок конфигурации [/ css]:
tools.gzip.on = True tools.gzip.mime_types = ['text/html', 'text/plain', 'text/css']
И даже после перезапуска процесса yslow по-прежнему сообщает, что мои CSS-файлы не загружены в архив. «wget -S» подтверждает, что cherrypy обслуживает мои CSS-файлы с типом mime text / css, поэтому тип mime указан правильно. Есть идеи, чего мне может не хватать? Если нет, я просто сделаю резервную копию encoding.py файл и добавьте туда некоторую логику отладки, чтобы показать мне, что происходит.2. Наконец-то у меня появилось больше времени, чтобы поиграть с этим. Я не уверен, что я делал изначально, но я добавил
tools.gzip.on = True
иtools.gzip.mime_types = ['text/html', 'text/plain', 'text/css', 'text/javascript']
в свой блок конфигурации [/]. Теперь YSlow доволен. Все, что необходимо сжать, сжимается. Спасибо за вашу помощь.3. Просто для пояснения:
tools.gzip.on = True
это необходимо в дополнение к настройке типа MIME.4. Чтобы это работало для JavaScript, мне пришлось также включить ‘application / *’. В итоге это выглядело так:
Ответ №2:
Чтобы это работало для Javascript, мне пришлось также включить ‘application / *’ в качестве mime_type.
Соответствующая часть моей конфигурации выглядит следующим образом:
'tools.gzip.on': True,
'tools.gzip.mime_types': ['text/*', 'application/*'],