如何存储全局(url_for)URL(以及其他全局变量)并在Flask应用程序中共享?

时间:2015-11-18 13:05:17

标签: python flask redis url-routing jinja2

我有一些数字jinja模板;每个共享一些常见的样式表和js资源。在Flask中,我使用url_for方法来识别每个URL。

例如

icomoonstyle = url_for('static', filename='css/icons/icomoon/styles.css')
bootstrapstyle = url_for('static', filename='css/bootstrap.min.css')
corestyle = url_for('static',filename='css/core.min.css')

我的问题是;如何在不同的路径中共享这些变量,而不必在每个装饰器函数下重新指定上面的代码?

我是否正确地说,这样的全球性事物应该存储在某种数据库或memcache(redis,mongo等)中? OR 是否有一种最佳实践方法可以在其他地方的代码中安全地存储这样的全局变量?

2 个答案:

答案 0 :(得分:2)

不,这些是静态值,它们不属于数据库或缓存;它们应该在代码中定义。

您可以将所有Jinja2模板的项目放入Environment.globals,然后查看the docs

答案 1 :(得分:2)

您可以使用app.context_processor向Jinja2环境添加值,直接将其提供给所有模板:

@app.context_processor
def provide_links():
    with app.app_context():
        return {
          "icomoonstyle": url_for('static', filename='css/icons/icomoon/styles.css'),
          "bootstrapstyle": url_for('static', filename='css/bootstrap.min.css'),
          "corestyle": url_for('static',filename='css/core.min.css')
        }

然后所有你的Jinja模板将能够使用返回字典中定义的变量:

<link rel="stylesheet" href="{{ icomoonstyle }}">

更好的是,您可以将所有样式放在一个列表中:

return {"STYLES": [
    url_for('static', filename='css/icons/icomoon/styles.css'),
    url_for('static', filename='css/bootstrap.min.css'),
    url_for('static',filename='css/core.min.css')
]}

然后循环遍历它们(假设您只在一个地方使用它们):

{% for style in STYLES %}
<link rel="stylesheet" href="{{ style }}">
{% endfor %}