如何不每次都为烧瓶中的静态文件重新定义url

Bud*_*ddy 6 python flask

我的应用程序有很多使用相同静态文件的路由.

我必须为每条路线定义它们,如下所示:

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")
Run Code Online (Sandbox Code Playgroud)

然后,当我渲染模板时,它看起来像这样:

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)
Run Code Online (Sandbox Code Playgroud)

我是烧瓶和蟒蛇的新手,我认为我所做的有点荒谬.我可以在一个地方定义它们然后只在我的模板中使用,而无需在每个路径定义中复制和粘贴吗?

Sim*_*pin 17

每次在Jinja中将它们注册为全局变量时,不要将这些变量传递给模板:

app.jinja_env.globals.update(
    css_reset=url_for("static", filename="reset.css"),
    css_main=url_for("static", filename="main.css"),
    ...
)
Run Code Online (Sandbox Code Playgroud)

或者,更好的是,注册一个辅助函数:

app.jinja_env.globals['static'] = (
    lambda filename: url_for('static', filename=filename))
Run Code Online (Sandbox Code Playgroud)

然后在你的模板中:

<link ref=stylesheet href="{{ static('main.css') }}">
Run Code Online (Sandbox Code Playgroud)


cod*_*ool 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)
Run Code Online (Sandbox Code Playgroud)

在模板中:

    {% assets %}
    <link rel="stylesheet" href="{{ ASSET_URL }}">
    {% endassets %}
Run Code Online (Sandbox Code Playgroud)

您还可以使用此扩展的某些选项压缩css和js文件以进行生产.

由于您需要在许多模板中使用这些文件,因此请在base.html模板中定义它们,并在每个模板中扩展该base.html.你不必一次又一次地写它们.