Python 如何避免每次在flask中重新定义静态文件的url

Python 如何避免每次在flask中重新定义静态文件的url,python,flask,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.mi

我的应用程序有很多路由使用同一组静态文件

我必须为每条路线定义它们,如下所示:

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)
然后,当我渲染模板时,它如下所示:

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)

我不熟悉flask和python,我觉得我现在做的有点可笑。我可以在一个地方定义它们,然后只在模板中使用,而不在每个路由定义中复制和粘贴吗?

您不需要这样做,url\u用于生成url(因此,当您更改url的结构时,您不需要更改十几次)。您可以直接在模板中使用静态文件的固定路径。只需将静态文件放入/static文件夹并在模板中使用即可:

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


您可能希望在config.py中定义一个变量并在模板中使用它,而不是直接用站点的URL替换您的站点URL:
{{config['SITE\u URL']+'/static/main.css'}

,而不是每次在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') }}">

最简单的方法是使用扩展

    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 %}
{%assets%}
{%endassets%}
您还可以使用此扩展的某些选项压缩css和js文件以用于生产

    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)

由于您需要在许多模板中使用这些文件,请在base.html模板中定义它们,并在每个模板中扩展该base.html。你不必一次又一次地写它们。

当你简单地写这个
href=“{{url\u for('static',filename='main.css')}}”就足够了。它的过早优化充其量也就足够了。这应该没什么大不了的。同一个站点可能可以通过多个URL为一个用户提供服务。另一方面,如果承载静态文件的路径发生了变化——例如,您将它们移动到AmazonS3,该怎么办?我同意上面Simon Sapin和codecool的观点;根据资源所在的位置,使用Flask资源或定义Jinja帮助器。