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

Созданный на 16 июл. 2013  ·  4Комментарии  ·  Источник: pallets/jinja

У меня есть шаблон с именем main.html. Он {% импортирует %} модуль с именем module_a (без контекста). module_a {% импортирует %} module_b таким же образом.

Когда я меняю module_a, загрузчик шаблонов распознает это и перезагружает.

Когда я изменяю module_b, загрузчик шаблона не распознает его. Я должен перезапустить процесс.

Я считаю, что это связано с тем, что сгенерированный код для module_a выполняет импорт в своей функции root(). get_template видит, что module_a обновлен, поэтому не перезагружает его, поэтому не запускает повторно его функцию root().

Я не уверен, как решить эту проблему. Очевидно, что вызывать root() при каждом вызове get_template — это плохо. Самым полным решением было бы отслеживать зависимости каждого шаблона, но это большая работа.

Самый полезный комментарий

Проблема в том, что импорт кэшируется, но не отслеживается. Я не уверен, какой лучший способ справиться с этим.

Все 4 Комментарий

Мы тоже сталкиваемся с этим. (Я почти не нашел эту ошибку, потому что вы не использовали термин auto_reload — это актуально только тогда, когда auto_reload=True ).

Похоже, это будет довольно сложно исправить; в идеале вы хотели бы, чтобы метод uptodate , возвращенный из get_source , проверял не только сам исходный файл, но и любой исходный файл, который он импортирует, расширяет или включает. Но в тот момент, когда uptodate определено, все, что у вас есть, это необработанный не проанализированный источник, поэтому эта информация недоступна.

Это может быть реализовано на более высоком уровне (например, в Template.is_up_to_date ), но похоже, что для получения информации о зависимости от компилятора также потребуется значительная операция.

Я просто столкнулся с этим. Это довольно раздражает при разработке, потому что это означает, что я должен установить cache_size в 0, и тогда все становится очень медленным (как и следовало ожидать).

Попробую покопаться во внутренностях, вдруг что-нибудь придумаю. В то же время, если бы кто-то с большим опытом мог бы предложить решение или даже какое-то направление, это было бы действительно здорово!

Проблема в том, что импорт кэшируется, но не отслеживается. Я не уверен, какой лучший способ справиться с этим.

Итак, проблема здесь не в кэшировании шаблона, а в кэшировании переменных, переданных в импортированные макросы.
(по крайней мере в моем случае)

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

В моем сценарии я делал макрос для разбиения на страницы. Макрос нуждался в объекте запроса.

начальный подход в макросе
{% set pagenum, limit = request.args.pg , request.args.limit %}
Сначала это будет работать, но при последующих запросах значения контекста макроса навсегда кэшируются, если только сервер не перезагрузится.

рабочий подход в рамках макроса
{% set pagenum, limit = request.get_params() %}
Теперь это будет возвращать мои обновленные параметры запроса при каждом вызове без ущерба для кэширования моих макросов.

Я также заметил, что кэширование макросов увеличивает время отклика примерно в 2,5 раза.
Без кэширования ~= 450 мс
С кэшированием ~= 150 мс

Была ли эта страница полезной?
0 / 5 - 0 рейтинги