Jinja: インポートされたテンプレートのキャッシュが長すぎます

作成日 2013年07月16日  ·  4コメント  ·  ソース: pallets/jinja

main.htmlというテンプレートがあります。 {%imports%} module_aというモジュール(コンテキストなし)。 module_a {%は%}module_bを同じ方法でインポートします。

module_aを変更すると、テンプレートローダーがこれを認識してリロードします。

module_bを変更すると、テンプレートローダーがそれを認識しません。 プロセスを再開する必要があります。

これは、module_a用に生成されたコードがroot()関数でインポートを実行するためだと思います。 get_templateは、module_aが最新であることを確認するため、再ロードしないため、root()関数を再実行しません。

これに対処する方法がわかりません。 明らかに、get_templateを呼び出すたびにroot()を呼び出すのは良くありません。 完全な解決策は、各テンプレートの依存関係を追跡することですが、それは多くの作業です。

最も参考になるコメント

問題は、インポートがキャッシュされているが追跡されていないことです。 これに対処する最善の方法が何であるかはわかりません。

全てのコメント4件

私たちはこれにも遭遇しています。 ( 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

このページは役に立ちましたか?
0 / 5 - 0 評価