2012-07-29 10 views
6

Mi aplicación tiene muchas rutas que usan el mismo conjunto de archivos estáticos.Cómo no redefinir url para archivos estáticos en el matraz cada vez

tengo que definirlos para cada ruta de la siguiente manera:

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") 

Y luego, cuando me hacen una plantilla que tiene este aspecto:

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) 

Soy nuevo en el frasco y la serpiente pitón y creo que lo que estoy haciendo es un poco ridículo. ¿Puedo definirlos en un solo lugar y luego usarlos en mis plantillas, sin copiar y pegar en cada definición de ruta?

Respuesta

12

La forma más sencilla es utilizar Flask-Assets extensión.

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) 

En plantilla:

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

También puede comprimir los archivos CSS y JS para la producción mediante el uso de ciertas opciones de esta extensión.

Dado que necesita utilizar estos archivos en muchas plantillas, defínalas en una plantilla base.html y en cada plantilla amplíe esa base.html. No tienes que escribirlos una y otra vez.

+0

[Enlace movido aquí] (http://flask-assets.readthedocs.org/en/latest/) – Belrog

-1

No necesita hacer eso, url_for es para generar URL (de modo que cuando cambie la estructura de una url, no necesite cambiarla una docena de veces). En su lugar, puede usar una ruta fija para sus archivos estáticos directamente en sus plantillas. Sólo hay que poner sus archivos estáticos en la carpeta/estático y utilizarlo en su plantilla:

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

En lugar de reemplazar YOUR_SITE_URL con la URL de su sitio directamente, es posible que desee definir una variable en su config.py y utilizarlo en su plantilla: {{ config['SITE_URL']+'/static/main.css' }}

+2

¿Por qué harías todo eso al escribir esto 'href =" {{url_for ('static', filename = 'main.css')}} "' sería suficiente? – codecool

+1

Su optimización prematura en el mejor de los casos. No debería importar mucho. – codecool

+0

Es posible que el mismo sitio se publique desde varias URL para uno. Por otro lado, ¿qué pasa si la ruta en la que está alojando los archivos estáticos cambia, por ejemplo, los mueve a Amazon S3? Estoy de acuerdo tanto con Simon Sapin como con Codecool; usa Flask-Assets, o define un Jinja helper, dependiendo de dónde estén alojados tus activos. –

16

en lugar de pasar estas variables a sus plantillas cada vez que puede registrarlos como globales en Jinja:

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

O, mejor aún, registrar una función auxiliar:

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

Y luego, en sus plantillas:

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