2012-07-29 51 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') }}">