Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to not redefine url for static files in flask everytime

Tags:

python

flask

My app has a lot of routes that use the same set of static files.

I have to define them for every route like this:

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

And then, when I render a template it looks like this:

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)

I'm new to flask and python and I think that what I'm doing is a bit ridiculous. Can I define them in one place and then just use in my templates, without copying and pasting in every route definition?

like image 839
Buddy Avatar asked Jul 29 '12 13:07

Buddy


2 Answers

Instead of passing these variables to your templates every time you can register them as globals in Jinja:

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

Or, better yet, register a helper function:

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

And then in your templates:

<link ref=stylesheet href="{{ static('main.css') }}">
like image 118
Simon Sapin Avatar answered Oct 20 '22 19:10

Simon Sapin


The simplest way is to use Flask-Assets extension.

    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)

In template:

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

You can also compress css and js files for production by using certain options of this extension.

Since you need to use these files in many templates, define them in a base.html template and in every template extend that base.html. You don not have to write them again and again.

like image 26
codecool Avatar answered Oct 20 '22 18:10

codecool