2012-07-29 36 views
6

我的应用程序有很多使用相同的一组静态文件的路线。如何不重新定义在烧瓶中的静态文件的URL每次

我必须确定它们像这样每路线:

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) 

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

回答

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。你不必一次又一次地写下它们。

+0

[链接移到这里](http://flask-assets.readthedocs.org/en/latest/) – Belrog 2014-04-21 17:44:21

-1

你不需要这样做,url_for用于生成url(所以当你改变一个url的结构时,你不需要改变它十几次)。您可以直接在模板中直接使用固定路径来访问静态文件。只要把你静态文件/文件夹的静态,并用它在你的模板:

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

,而不是直接与您的网站的网址替换YOUR_SITE_URL的,你可能想在你的config.py定义一个变量,并使用它你模板:或者

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

,更好的是,注册一个辅助函数:{{ config['SITE_URL']+'/static/main.css' }}

+2

为什么只要编写这个'href =“{{url_for('static',filename ='main.css')}}'就足够了? – codecool 2012-07-30 09:33:30

+1

它的过早优化最好。这应该不重要。 – codecool 2012-07-30 09:55:40

+0

有可能同一个网站可以从多个网址提供一个网址。另一种情况是,如果您托管静态文件的路径发生变化 - 例如,您将它们移动到Amazon S3上?我同意Simon Sapin和上面的codecool;使用Flask-Assets,或者定义一个Jinja助手,这取决于你的资产托管的位置。 – 2013-02-15 21:41:55

16

而是每次路过这些变量到你的模板,你可以为他们在全局注册金贾

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

,然后在模板:

<link ref=stylesheet href="{{ static('main.css') }}">