4

アプリケーションを再起動せずに、djangoアプリでJinja2テンプレートを切り替えようとしています。

誰かがこれをしましたか?基本的に、スキン選択の変更が適用されたら、jinja2にテンプレートを再ロードさせる必要があります。

テンプレート環境オブジェクトにキャッシュオブジェクトを再作成しようとしましたが、効果はありません。

myskin_utils.py:

from jinja2.environment import create_cache
ENV_OBJECT.cache = create_cache(50)

ENV_OBJECTを含むモジュールをリロードしようとしました

reload(myskin) #also no effect on the output

その場で変えたいもう一つのことは言語ですが、それは別の質問だと思います。

アドバイスありがとうございます。

編集: jinja2でキャッシュを設定していませんが、Djangoテンプレートから切り替えた後、Jinjaを使用するとスピードアップします。テンプレートのバイトコードは、ビュー関数のコンパイル済みコードに含まれていると思われますが、詳細は調べませんでした。ジンジャの。

ENV(CoffinEnvironmentJinjaのサブクラスのインスタンスEnvironment)をビューモジュールのグローバル名前空間にインポートし、ENV.get_template()ビュー関数(Django + Coffin + Jinja2)内を呼び出します。

ビュー関数内の環境モジュールでpythonのreload()組み込みを呼び出すと、テンプレートが切り替わりますが、そのコードをすべての関数に貼り付けたくないことがわかりました。

4

2 に答える 2

4

デフォルトでは、Jinja2 はキャッシュをまったく使用しませんが、処理を少し高速化するためにキャッシュ バックエンドを構成することをお勧めします。そのため、jinja2 はリクエストごとにすべてのテンプレートを解析してコンパイルする必要はありません。Jinja2 は現在、すぐに使用できる 2 つの異なるキャッシュ タイプをサポートしています。

そのうちの 1 つはFileSystemBytecodeCache、(名前が示すように) ファイル ベースです。したがって、コンパイルされたすべてのテンプレートはファイル システムに保存され、そこから取得されます。実装をよく見るとcache.clear()、この一時フォルダー内のすべてのファイルを単純に削除するメソッドも見つかります。すべてのテンプレートが再度解析/コンパイルされるようにします。

もう 1 つのキャッシュ タイプは、MemcachedBytecodeCacheMemcache のシン ラッパーである call です。この方法をお勧めします。Memcache はすべてをメモリに格納するため、ディスクにヒットするよりも少し高速であり、異なるホストから同じキャッシュを使用できるためです (これは、ある種のクラスターを実行している場合に役立ちます)。

基礎となる Memcache クライアント (werkzeug.contrib.cache、python-memcached、または cmemcache のいずれか) もclear()、キャッシュ内のすべてを削除するメソッドを提供します。しかし、おそらく他のことにもキャッシュを使用するため (たとえば、高価なデータベースクエリの結果をそこに保存するなど)、clear()メソッドはすべて (テンプレートだけでなく) に影響するため、jinja では公開されません。

したがって、オプションを要約すると、次のようになります。

  • キャッシュなしで Jinja2 を使用する
  • FileSystemBytecodeCacheおよび呼び出しで Jinja2 を使用するcache.clear()
  • MemcachedBytecodeCacheand 呼び出しで Jinja2 を使用しますmemcache_client.clear()(これにより、キャッシュ内の他のすべてもクリアされます)。
  • Jinja2 でのみ使用される別のポートで別の memcached プロセスを実行します。次に呼び出すmemcache_client.clear()と、すべてのテンプレートがクリアされます。
于 2010-11-18T12:01:20.023 に答える
1

これは間違っています。Jinja は、デフォルトで cache_size (Environment パラメーター) の LRUCache をメモリ キャッシュで使用します。ディスク キャッシュを使用して、後でアプリ プリフォーマントを再起動することもできます (再コンパイルは不要です)。

于 2018-03-07T12:16:02.880 に答える