Django: рекомендации по ускорению выполнения рендеринга шаблонов

Как я могу ускорить рендеринг шаблона Django? Мой шаблон занимает около 1-2 секунд для рендеринга, после того как функция просмотра полностью вычислит все, что ему нужно.

Я уже пытался выполнить весь доступ к базе данных в представлении, так что шаблон попадает только в ОЗУ, а не в механизм БД.

У меня есть много include - может быть проблема там?

Ответ 1

Я просто потратил много времени на оптимизацию моего кода шаблона django. Ниже приведены рекомендации по оптимизации, которые работали для меня, но в зависимости от вашей настройки вы не можете получить столь же значительное ускорение.

  • Загрузите модуль построения шаблонов unicode, а не str. Django заставляет все переменные в unicode. Это не займет слишком много времени, но если переменная str используется во многих местах ваших шаблонов, она может превратиться в заметную задержку. Это очень легко исправить, всякий раз, когда вы отправляете текстовые данные в рендеринг Django, убедитесь, что он unicode.
  • Отметить переменные как safe. Автоматические меры безопасности Django действительно приятные, но они приходят с небольшим ударом с высокой производительностью. Если вы используете много переменных в своем шаблоне, и знаете, что это безопасно, тогда обязательно отметьте их как таковые.
  • Cache Compiled Templates. Когда вы вызываете render_template_from_string, django вытягивает шаблон, компилирует его и затем его выводит. Django упрощает кэширование первых двух частей этого процесса и сохраняет их в памяти. Все, что вам нужно сделать, это сделать небольшое изменение в вашем файле settings.py, чтобы добавить cached.Loader в ваш TEMPLATE_LOADERS. Подробнее о в документации Django.
  • Исправить или не использовать endless pagination. Я обнаружил, что плагин бесконечный pagination замедляет работу, Это потому, что он должен загрузить новый шаблон для каждого номера страницы. Я вошел и взломал его, пока не получил, что делаю то, что хочу, но прежде чем вы это сделаете, попробуйте удалить его и посмотреть, какое качество улучшения вы получите.
  • Не используйте возможности Fancy Templating. Наследование, вложенные блоки, для циклов и приложений отлично, но они имеют стоимость исполнения. Будьте очень осторожны при их использовании и старайтесь не выполнять несколько уровней наследования. Для циклов можно лучше обрабатывать рендеринг на стороне клиента.
  • Резервное копирование на стороне клиента. Легкий трюк для ускорения обработки на стороне сервера - это просто сделать это на клиенте. Одна из стратегий заключается в том, чтобы встроить json-структуру в шаблон django, а затем построить javascript HTML. Это явно побеждает цель рендеринга стороны сервера django, но это приведет к ускорению. Это особенно полезно, если вам нужно отображать содержимое под сгибом (то есть пользователю не нужно сразу видеть его при загрузке страницы).

Выполнение вышеописанного сокращает время рендеринга сложной страницы на примере GAE примерно с 1.0S до 250ms, но опять же ваш пробег может меняться.

Ответ 2

В качестве шага 0 я бы порекомендовал добавить на панель инструментов отладки Django дополнительную панель под названием Синхронизация шаблонов панели инструментов Django. Он точно сказал мне, сколько времени было потрачено в каждом шаблоне (блоке и т.д.) И сколько этого времени занято в SQL. Это также дополнительная проверка того, что это ваша проблема.

enter image description here

Вот как добавить панель на панель отладки.http://django-debug-toolbar.readthedocs.org/en/latest/configuration.html#debug-toolbar-panels

Ответ 3

Еще один трюк, который я нашел: мне нужно было отобразить таблицу HTML из 755 строк * 15 столбцов (заполнив в общей сложности 11 325 данных).

Эта страница имела обыкновение задерживать загрузку примерно на 25/30 секунд, а затем страница была немного запаздывающей. Я установил таблицу с помощью display:none и после полной загрузки страницы изменил свойство CSS с помощью JavaScript.

После всего этого страница загружается максимум за 6 секунд. Я полагаю, что Джанго тратит гораздо меньше времени на рендеринг невидимых элементов.

Я не знаю, работает ли это только в моем случае, но, похоже, так и есть.

Ответ 4

Используйте ManifestStaticFilesStorage для обслуживания ваших статических файлов. Увеличение производительности, которое я наблюдал в связи с использованием CachedStaticFilesStorage со значением по умолчанию LocMemCache, огромно. Разница в том, что хэши никогда не нужно вычислять во время выполнения.

Я не совсем понимаю, почему разница столь же велика, как и сейчас - хотя верно, что CachedStaticFilesStorage первоначально должен был бы вычислять хеши и заполнять кеш, после того, как кеш заполнен, я не ожидаю значительного снижения производительности по сравнению с явный метод. Но это масштабно, и документация также рекомендует использовать ManifestStaticFilesStorage для производительности.