У меня есть шаблон с именем main.html. Он {% импортирует %} модуль с именем module_a (без контекста). module_a {% импортирует %} module_b таким же образом.
Когда я меняю module_a, загрузчик шаблонов распознает это и перезагружает.
Когда я изменяю module_b, загрузчик шаблона не распознает его. Я должен перезапустить процесс.
Я считаю, что это связано с тем, что сгенерированный код для module_a выполняет импорт в своей функции root(). get_template видит, что module_a обновлен, поэтому не перезагружает его, поэтому не запускает повторно его функцию root().
Я не уверен, как решить эту проблему. Очевидно, что вызывать root() при каждом вызове get_template — это плохо. Самым полным решением было бы отслеживать зависимости каждого шаблона, но это большая работа.
Мы тоже сталкиваемся с этим. (Я почти не нашел эту ошибку, потому что вы не использовали термин 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 мс
Самый полезный комментарий
Проблема в том, что импорт кэшируется, но не отслеживается. Я не уверен, какой лучший способ справиться с этим.