相当于 Flask 中的通配符 url_for?

Equivalent to wildcards in Flask's url_for?

我正在开发一个 Flask 应用程序,并将其设置为我的应用程序的 CSS 文件是通过此构建脚本以随机名称生成的:

rm style/main-*.css;
KEY=`tr -dc A-Za-z0-9 </dev/urandom | head -c 6`;
postcss build ./style/src/main.css -o ./style/main-$KEY.css

这主要是出于与缓存相关的原因;但它无论如何都会产生一个带有通配符模式的名称 main-*.css 因为这个名字在每次构建时都是随机的,所以我不想编辑我包含它的模板。不幸的是,通配符在 Flask 中似乎不起作用,如下所示:

<link rel='stylesheet" href='{{ url_for('static', filename='style/main-*.css') }}'>

... 什么都不做(当然,除了产生 404)。 有没有办法通过 Flask 做这种行为?谢谢。

您可以编写自己的函数并将其作为全局函数添加到 jinja2 环境中。

import os
from glob import glob
from flask import current_app

def glob_assets(target):
    root = current_app.static_folder
    return [f[len(root)+1:] for f in glob(os.path.join(root, target))]

app.jinja_env.globals.update(get_assets=glob_assets)

然后您可以在一次迭代中将样式表添加到模板。

{% for css in get_assets('style/main-*.css') -%}
<link rel="stylesheet" href="{{ url_for('static', filename=css) }}">
{% endfor -%}