1

これは SO に関する私の最初の質問であり、改善に関するヒントを喜んでお受けします。穏やかな :)

保守性を高めるために、CSS、JS、HTML をすべて同じファイルにまとめるようにしています。インクルード ファイルやマクロなどを使用すると、これが難しくなります。最終出力template.render()では、CSS と JS をすべて取得し、ベース HTML テンプレートの上部と下部に配置する必要があります。

例は私が何を意味するかを説明する必要があります:

base.html

<html>
<head>
  <style>
    {{ print_css() }}
  </style>
</head>
<body>
  {% include 'bolded_text.html' %}
  <script>
    {{ print_js() }}
  </script>
</body>
</html>

bolded_text.html

{# this doesn't need to be a filter. It could be a block, or anything else that would make this work #}
{% filter add_css %}
   strong {
     background: #ccc;
   }
{% endfilter %}
<strong>Bolded text</strong>
{% filter add_js %}
   alert('javascript included!');
{% endfilter %}

もちろん、出力は次のようになります。

<html>
<head>
  <style>
    strong {
      background: #ccc;
    }
  </style>
</head>
<body>
  {% include 'bolded_text.html' %}
  <script>
    alert('javascript included!')
  </script>
</body>
</html>

予想どおり、問題は print_css() が何も出力しないことです。

コンテキスト フィルターを使用してこれを実行してみました。コンテキスト内の変数に whereadd_jsおよびadd_cssappend し、その変数print_cssprint_js出力します。print ステートメントはすべてのフィルターに従うため、これは JavaScript に対して適切かつ簡単に機能します。

ただし、CSS で動作させる方法が思い浮かびません。print_css()呼び出しを遅延させるか、何らかの方法で jinja2 AST の出力を入れ替えることができれば、うまくいくかもしれません。私はハッキーな文字列操作 (CSS を下部に出力し、正規表現を使用して上部に移動するなど) を避けようとしています。

これをエレガントに行う方法があるかもしれないと考えましたが、jinja2 の低レベル API に関する私の経験は限られています。

どんな助けでも大歓迎です、ありがとう!

4

1 に答える 1

0

マクロはそれを行いますが、StyleSheets を使用しない理由がわかりません。これにより、ブラウザのキャッシュが改善され、保守も容易になります。

編集

例:

{% macro generate_css(strong_bg='#ccc', additional_options=None) -%}
    strong {
        background: {{ strong_bg }};
    }
{%- endmacro %}

<head>
  <style>
    {{ generate_css() }}
  </style>
</head>
于 2012-05-01T13:37:51.087 に答える