6

私のアプリには、同じ静的ファイルのセットを使用する多くのルートがあります。

次のように、すべてのルートに対してそれらを定義する必要があります。

css_reset = url_for("static", filename="reset.css")
css_main = url_for("static", filename="main.css")
css_fonts = url_for("static", filename="fonts.css")

js_jquery = url_for("static", filename="jquery-1.7.2.min.js")
js_main = url_for("static", filename="main.js")

そして、テンプレートをレンダリングすると、次のようになります。

return render_template("person.html",
                       css_main=css_main,
                       css_reset=css_reset,
                       css_fonts=css_fonts,
                       js_jquery=js_jquery,
                       js_main=js_main)

私はフラスコとパイソンが初めてで、私がやっていることは少しばかげていると思います。それらを 1 か所で定義してから、すべてのルート定義にコピー アンド ペーストせずにテンプレートで使用することはできますか?

4

3 に答える 3

17

これらの変数をテンプレートに渡す代わりに、Jinjaでグローバルとして登録できます。

app.jinja_env.globals.update(
    css_reset=url_for("static", filename="reset.css"),
    css_main=url_for("static", filename="main.css"),
    ...
)

または、さらに良いことに、ヘルパー関数を登録します。

app.jinja_env.globals['static'] = (
    lambda filename: url_for('static', filename=filename))

そして、テンプレートで:

<link ref=stylesheet href="{{ static('main.css') }}">
于 2012-07-30T08:41:59.067 に答える
12

最も簡単な方法は、Flask-Assets拡張機能を使用することです。

    from flask.ext.assets import Environment, Bundle
    assets = Environment(app)
    css_all = Bundle('reset.css','main.css','fonts.css')
    assets.register('css_all',css_all)

テンプレート内:

    {% assets %}
    <link rel="stylesheet" href="{{ ASSET_URL }}">
    {% endassets %}

この拡張機能の特定のオプションを使用して、本番用に css および js ファイルを圧縮することもできます。

これらのファイルは多くのテンプレートで使用する必要があるため、base.html テンプレートで定義し、すべてのテンプレートでその base.html を拡張します。何度も何度も書く必要はありません。

于 2012-07-30T09:25:56.503 に答える
-1

url_for は URL を生成するためのものです (そのため、URL の構造を変更するときに、何度も変更する必要はありません)。代わりに、静的ファイルへの固定パスをテンプレートで直接使用できます。静的ファイルを /static フォルダーに入れて、テンプレートで使用するだけです。

<link rel="stylesheet" href="{{ YOUR_SITE_URL_HERE+'/static/main.css' }}">

YOUR_SITE_URL をサイトの URL に直接置き換える代わりに、 config.py で変数を定義してテンプレートで使用することをお勧めします。{{ config['SITE_URL']+'/static/main.css' }}

于 2012-07-29T14:03:02.143 に答える