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

时间:2012-07-29 13:48:42

标签: 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")

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

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)

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

3 个答案:

答案 0 :(得分: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') }}">

答案 1 :(得分: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。你不必一次又一次地写它们。

答案 2 :(得分:-1)

您不需要这样做,url_for用于生成网址(这样当您更改网址的结构时,您不需要更改它十几次)。您可以直接在模板中使用固定路径到静态文件。只需将静态文件放在/ static文件夹中,然后在模板中使用它:

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

您可能希望在config.py中定义变量并在模板中使用该变量,而不是直接将YOUR_SITE_URL替换为您网站的网址:{{ config['SITE_URL']+'/static/main.css' }}