Flaskjinjia2过滤器

本文介绍了如何使用Jinja2的过滤器来处理Flask服务器返回的数据,特别是通过`tojson`过滤器将包含HTML字符的文本转化为JSON格式,以便于进一步操作。还列举了字符串、数值、列表和字典操作的常用过滤器,并提到在必要时可以自定义过滤器。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

因为方便才使用的jinjia2,但是很多时候服务器直接返回的数据不符合我们的需求,那么就可以使用jinjia2的过滤器来洗一下这些数据了

先来一个最实用的
{{ dict | tojson }}
如果服务器直接返回数据而我们直接用jinjia2去接收,输出的时候会变成有Html字符的文本,根本不能用,要使用tojson过滤器把这些数据变成json格式,就可以愉快的玩耍了

  • 根据数据格式列举几个常用的过滤器
  • 字符串操作
{# 当变量未定义时,显示默认字符串,可以缩写为d #}
<p>{{ name | default('No name', true) }}</p>
  
{# 单词首字母大写 #}
<p>{{ 'hello' | capitalize }}</p>
  
{# 单词全小写 #}
<p>{{ 'XML' | lower }}</p>
  
{# 去除字符串前后的空白字符 #}
<p>{{ '  hello  ' | trim }}</p>
  
{# 字符串反转,返回"olleh" #}
<p>{{ 'hello' | reverse }}</p>
  
{# 格式化输出,返回"Number is 2" #}
<p>{{ '%s is %d' | format("Number", 2) }}</p>
  
{# 关闭HTML自动转义 #}
<p>{{ '<em>name</em>' | safe }}</p>
  
{% autoescape false %}
{# HTML转义,即使autoescape关了也转义,可以缩写为e #}
<p>{{ '<em>name</em>' | escape }}</p>
{% endautoescape %}
  • 数值操作
{# 四舍五入取整,返回13.0 #}
<p>{{ 12.8888 | round }}</p>
  
{# 向下截取到小数点后2位,返回12.88 #}
<p>{{ 12.8888 | round(2, 'floor') }}</p>
  
{# 绝对值,返回12 #}
<p>{{ -12 | abs }}</p>
  • 列表操作
{# 取第一个元素 #}
<p>{{ [1,2,3,4,5] | first }}</p>
  
{# 取最后一个元素 #}
<p>{{ [1,2,3,4,5] | last }}</p>
  
{# 返回列表长度,可以写为count #}
<p>{{ [1,2,3,4,5] | length }}</p>
  
{# 列表求和 #}
<p>{{ [1,2,3,4,5] | sum }}</p>
  
{# 列表排序,默认为升序 #}
<p>{{ [3,2,1,5,4] | sort }}</p>
  
{# 合并为字符串,返回"1 | 2 | 3 | 4 | 5" #}
<p>{{ [1,2,3,4,5] | join(' | ') }}</p>
  
{# 列表中所有元素都全大写。这里可以用upper,lower,但capitalize无效 #}
<p>{{ ['tom','bob','ada'] | upper }}</p>
  • 字典操作:
{% set users=[{'name':'Tom','gender':'M','age':20},
              {'name':'John','gender':'M','age':18},
              {'name':'Mary','gender':'F','age':24},
              {'name':'Bob','gender':'M','age':31},
              {'name':'Lisa','gender':'F','age':19}]
%}
  
  
  
{# 按指定字段排序,这里设reverse为true使其按降序排 #}
<ul>
{% for user in users | sort(attribute='age', reverse=true) %}
     <li>{{ user.name }}, {{ user.age }}</li>
{% endfor %}
</ul>
  
{# 列表分组,每组是一个子列表,组名就是分组项的值 #}
<ul>
{% for group in users|groupby('gender') %}
    <li>{{ group.grouper }}<ul>
    {% for user in group.list %}
        <li>{{ user.name }}</li>
    {% endfor %}</ul></li>
{% endfor %}
</ul>
  
{# 取字典中的某一项组成列表,再将其连接起来 #}
<p>{{ users | map(attribute='name') | join(', ') }}</p>

{#  把字典转换为json格式,js文件可以直接使用 #}
{{ dict | tojson }}

如果还不能愉快的玩耍,可以考虑自己写一个哟
直接上代码:

from flask import Flask,render_template
 
app = Flask(__name__)
 
@app.route('/glq')
@app.route('/glq/<name>')
def hello(name=None):
    return render_template('glq.html', name=name)
 
########## 创建过滤器并添加 ##########
# 方法1:
def double_step_filter(l):
    return l[::2]
app.add_template_filter(double_step_filter, 'double_step')
 
 # 方法2:
@app.template_filter('sub')
def sub(l, start, end):
    return l[start:end]
 
 # Flask添加过滤器的方法实际上是封装了对Jinja2环境变量的操作。上述添加”sub”过滤器的方法,等同于下面的代码。
#app.jinja_env.filters['sub'] = sub
 
if __name__ == '__main__':
    app.run(host='0.0.0.0', debug=True)

两种不同的创建方法说不上谁好谁不好,看你那个方法用的顺手咯

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值