django: рекомендации по повышению производительности рендеринга шаблонов - PullRequest
9 голосов
/ 20 декабря 2011

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

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

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

Ответы [ 3 ]

19 голосов
/ 27 октября 2014

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

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

Выполнение вышесказанного сократило мое время рендеринга сложной страницы на экземпляре GAE примерно с 1,0 с до 250 мс, но, опять же, ваш пробег может отличаться.

9 голосов
/ 07 октября 2015

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

enter image description here

Вот как добавить панель на панель инструментов отладки. http://django -debug-toolbar.readthedocs.org / ен / последний / configuration.html # отладки панели инструментов-панели

0 голосов
/ 17 мая 2018

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...