Jinja模板使用

本文介绍了Jinja模板语言在Flask中的使用,包括if...else语句的使用方式,如何进行条件判断和多分支选择。此外,还讲解了过滤器的概念,它们可以通过管道符号操作变量,实现如去除HTML标签、转换大小写等功能。Jinja还提供了测试功能,用于检查变量是否存在等。内置的过滤器和测试列表可在官方文档中找到。

Flask默认使用了jinja模板语言,jinja的设计文档在这里

jinja提供了一些方便的函数调用,例如常见的for、if…else。
例如:

<ul id="navigation">
   {% for item in navigation %}
       <li><a href="{{ item.href }}">{{ item.caption }}</a></li>
   {% endfor %}
</ul>

if语句可以测试 一个变量是否未定义,为空或 false。
一般的语法是
<do something> if <something is true> else <do something else>
其中else 部分是可选的,也可以用 elif 和 else 来构建多个分支

{% if kenny.sick %}
    Kenny is sick.
{% elif kenny.dead %}
    You killed Kenny!  You bastard!!!
{% else %}
    Kenny looks okay --- so far
{% endif %}

官方文档给出的if用作内联表达式的例子很有用,

{% extends layout_template if layout_template is defined else 'master.html' %}

这在一个变量定义的情况下才继承一个模板,否则继承默认的布局模板。例如登录前和登录后继承不同的模板,就可以这样实现。

还可以这样用:

{{ '[%s]' % page.title if page.title }}

这里没有显式地提供 else 块,会求值一个未定义对象

还可以用作循环过滤:

{% for user in users if not user.hidden %}
    <li>{{ user.username|e }}</li>
{% endfor %}

另一个很有用的是过滤器,实际上也就是对变量进行操作的函数。
过滤器与变量用管道符号( | )分割,并且也 可以用圆括号传递可选参数。多个过滤器可以链式调用,前一个过滤器的输出会被作为 后一个过滤器的输入。
例如:

{{ name|striptags|title }} 

这句实际上会移除 name 中的所有 HTML 标签并且改写为标题样式的大小写格式,具体是由两个内置过滤器striptags和title实现的。可以在这里查看所有的内置过滤器。

除了过滤器,还可以使用测试,用is来测试变量或表达式,例如name is defined用来测试name是否被定义过。内置的测试清单在这里

### 如何在 Apache Superset使用 Jinja 模板进行动态查询或配置 Apache Superset 支持通过 Jinja 模板实现动态 SQL 查询。这种功能允许用户根据上下文变量生成动态的 SQL 语句,从而增强查询的灵活性和可扩展性。以下是具体实现方式及相关细节: #### 配置 Jinja 上下文 在 Superset 的配置文件中,可以通过 `JINJA_CONTEXT_ADDONS` 参数添加自定义的 Jinja 上下文变量。例如,以下代码片段展示了如何定义一个名为 `my_crazy_macro` 的宏函数[^1]: ```python JINJA_CONTEXT_ADDONS = { 'my_crazy_macro': lambda x: x * 2, } ``` 上述配置将 `my_crazy_macro` 添加到 Jinja 上下文中,使其可以在 SQL 查询中被调用。 #### 在 SQL 查询中使用 Jinja 模板 Superset 的 SQL Lab 和 Explore 功能支持 Jinja 模板语法[^2]。用户可以在 SQL 查询中嵌入 Jinja 表达式,以实现动态内容生成。以下是一个示例 SQL 查询,展示了如何使用 Jinja 模板: ```sql SELECT * FROM sales WHERE date >= '{{ yesterday_ds }}' AND date <= '{{ today_ds }}' AND value > {{ my_crazy_macro(10) }} ``` - `{{ yesterday_ds }}` 和 `{{ today_ds }}` 是 Superset 内置的 Jinja 变量,分别表示昨天和今天的日期。 - `{{ my_crazy_macro(10) }}` 调用了前面定义的自定义宏函数,返回值为 `20`。 #### 动态参数的来源 Jinja 模板中的动态参数可以来自多个来源: 1. **内置变量**:如 `yesterday_ds`、`today_ds` 等,由 Superset 自动提供。 2. **自定义上下文**:通过 `JINJA_CONTEXT_ADDONS` 配置的变量。 3. **仪表盘过滤器**:用户可以在仪表盘中设置过滤器,并将其值传递给 SQL 查询。 4. **URL 查询参数**:通过 URL 传递的参数也可以作为 Jinja 模板的上下文变量。 #### 示例:结合仪表盘过滤器使用 Jinja 模板 假设有一个仪表盘,用户可以通过过滤器选择特定的日期范围。以下 SQL 查询展示了如何结合仪表盘过滤器使用 Jinja 模板: ```sql SELECT * FROM orders WHERE order_date >= '{{ dashboard_filters.get("start_date") }}' AND order_date <= '{{ dashboard_filters.get("end_date") }}' ``` 在此示例中,`dashboard_filters` 是 Superset 提供的一个特殊对象,用于访问仪表盘过滤器的值[^3]。 #### 注意事项 1. **安全性**:Jinja 模板使用可能带来安全风险(如代码注入)。确保对用户输入进行严格验证。 2. **性能**:动态查询可能影响查询性能,建议优化 SQL 并合理使用缓存机制。 3. **调试**:如果查询未按预期执行,可以通过 Superset 的日志功能检查生成的最终 SQL。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值