【问题标题】:How to not redefine url for static files in flask everytime如何每次都不为烧瓶中的静态文件重新定义 url
【发布时间】:2012-07-29 13:48:41
【问题描述】:

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

我必须像这样为每条路线定义它们:

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 的新手,我认为我正在做的事情有点荒谬。我可以在一个地方定义它们,然后在我的模板中使用,而不在每个路由定义中复制和粘贴吗?

【问题讨论】:

    标签: python flask


    【解决方案1】:

    每次您可以在 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') }}">
    

    【讨论】:

      【解决方案2】:

      最简单的方法是使用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。您不必一次又一次地编写它们。

      【讨论】:

        【解决方案3】:

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

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

        您可能希望在 config.py 中定义一个变量并在模板中使用它,而不是直接将 YOUR_SITE_URL 替换为您网站的 url:{{ config['SITE_URL']+'/static/main.css' }}

        【讨论】:

        • 只要写这个href="{{ url_for('static',filename='main.css')}}"就够了,你为什么要这么做?
        • 它充其量是过早的优化。应该没什么大不了的。
        • 同一个站点可能会从多个 URL 提供一个。另一方面,如果您托管静态文件的路径发生变化——例如,您将它们移动到 Amazon S3,该怎么办?我同意上面的 Simon Sapin 和 codecool;使用 Flask-Assets,或定义 Jinja 助手,具体取决于您的资产托管位置。
        猜你喜欢
        • 1970-01-01
        • 2017-09-20
        • 2012-08-20
        • 1970-01-01
        • 2012-04-06
        • 1970-01-01
        • 2021-05-20
        • 1970-01-01
        • 2015-10-25
        相关资源
        最近更新 更多