1

jinja テンプレート内の場合:

  1. {%extends xxx_string%} および {% include xxx_string%} に提供された文字列はどのように解決されますか?
  2. これは実際のファイルシステムまたは生成された名前空間 (Flask.url_for 関数を使用する場合など) に関連していますか?

最終的に、テンプレート内では相対インポートを使用したいと考えています (ブループリントに関して、すべてのテンプレート内のファイル システムの場所を更新する必要はありません)。私はできるようになりたいです:

  1. 実際のブループリント パッケージとそのネストされた静的/テンプレート リソースを任意のファイル システム パスに保存します。('/bob/projects/2013_07/marketanalysis')
  2. Python ブループリント パッケージ内で、別の「slugname」を定義して、ブループリント インスタンスとそのすべてのリソースを参照します。このスラッグ名をアプリケーションに登録して、グローバル参照を行います。(グローバル名の衝突や競合状態なし)
  3. 青写真がどのように使用されているか (見出し、表紙、イントロ、全文、引用) に応じて、「型にはまった」レイアウトを提供する汎用ビュー関数を用意します。
  4. 内部的には、ブループリント パッケージのファイル システム内で、テンプレート内で extends()/include() を解決するときに相対パス名を使用します (url_for相対ブループリント ビューを参照するときのショートカットに似ています)。

blueprint パッケージがそのすべてのリソースにバンドルされている場合、それがどこにデプロイされるかがわからず、異なるslug-names の下で何度も再配置される可能性があるという考えです。Pythonインターフェースはすべての「バンドル」で同じである必要がありますが、html コンテンツ、css、javascript、および画像/ダウンロードはバンドルごとに異なります。


私は質問をかなり鋭くしました。これがこのスレッドで進むべき範囲だと思います。

4

3 に答える 3

0

私の「リソースバンドル」の最も適切な解決策は、Jinja ローダーで処理する必要があるようです ( Jinja Docs on Loadersを参照)。すぐに、jinja2.PackageLoaderjinja2.PrefixLoader、および jinja2.DictLoader が楽しくなりそうです。

このSimilar Threadに対する受け入れられた回答は、ローダーがFlaskでどのように処理されるかについてのアイデアを提供します。ほとんどの場合、デフォルトの application-level から離れることができますDispatchingJinjaLoader

デフォルトでは、ブループリントは最終的self.jinja_loaderに ...

jinja2.FileSystemLoader(os.path.join(self.root_path,
                                     self.template_folder)) 

これは、デフォルトの解決アルゴリズムがいかに単純で、ブループリント固有の機能をいかに簡単に拡張できるかを理解するのに役立ちます。サブクラス化されたローダーとカスタム ローダーを巧みに組み合わせることで、よりスマートなローダーを作成し、チートに役立ついくつかの魔法を忍び込ませることができます。

真の力は、CustomBaseLoader.list_templates() をオーバーライドすることと、アプリケーションの DispatcherJinjaLoader にフックされた簡単な小さな ProxyLoader をオーバーライドすることから得られます。これは、通常のルックアップよりも優先されます。

于 2013-08-02T04:43:39.140 に答える
0

私の意見では、プレフィックスの代わりにフォルダーを使用すると、もう少しクリーンになります。アプリケーション構造の例:

yourapplication
|- bp143
   |- templates
      |- bp143
         |- index.jinja
         |- quiz.jinja
         |- context.jinja
|- templates
   |- base.jinja
   |- index.jinja
   |- bp143
      |- context.jinja

上記の構造を使用すると、次のようにテンプレートを参照できます。

base.jinja --> comes from the application package
index.jinja --> comes from the application package
bp143/index.jinja --> comes from the blueprint
bp143/context.jinja --> comes from the application package (the app overrides the template of the same name in the blueprint)
于 2013-07-26T04:25:50.183 に答える