main.htmlというテンプレートがあります。 {%imports%} module_aというモジュール(コンテキストなし)。 module_a {%は%}module_bを同じ方法でインポートします。
module_aを変更すると、テンプレートローダーがこれを認識してリロードします。
module_bを変更すると、テンプレートローダーがそれを認識しません。 プロセスを再開する必要があります。
これは、module_a用に生成されたコードがroot()関数でインポートを実行するためだと思います。 get_templateは、module_aが最新であることを確認するため、再ロードしないため、root()関数を再実行しません。
これに対処する方法がわかりません。 明らかに、get_templateを呼び出すたびにroot()を呼び出すのは良くありません。 完全な解決策は、各テンプレートの依存関係を追跡することですが、それは多くの作業です。
私たちはこれにも遭遇しています。 ( auto_reload
という用語を使用しなかったため、このバグはほとんど見つかりませんでした。これは、 auto_reload=True
の場合にのみ関係します)。
これを修正するのはかなり難しいようです。 理想的には、 get_source
から返されたuptodate
メソッドで、ソースファイル自体だけでなく、インポート、拡張、またはインクルードするソースファイルもチェックする必要があります。 ただし、 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倍高速になることにも気づきました。
キャッシュなし〜= 450ms
キャッシングあり〜= 150ms
最も参考になるコメント
問題は、インポートがキャッシュされているが追跡されていないことです。 これに対処する最善の方法が何であるかはわかりません。