python Jinja2 模板编程

本文介绍Jinja2的基本语法,包括控制结构、变量取值、注释及如何使用render进行输出。涵盖数据处理、表达式、过滤器等关键特性,通过实例演示for循环、条件判断和数据操作。

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

Jinja2基本语法

  • {% %} 控制结构,可以用来写判断循环等语句
  • {{}} 变量取值
  • {# #} 注释

快速入门的例子

from jinja2 import Template
## ex1
t = Template("hello {{person}}")
msg = t.render(person="bob")
print(msg)   # hello bob

## ex2
t = Template("My favorite numbers : {% for n in range(1, 5)%} {{n}} {% endfor %}")
msg = t.render() # 'My favorite numbers :  1  2  3  4 '

## ex3
t = Template("my name is {{name}} and i am {{age}}")
msg = t.render(name="jsh", age=24)
print(msg) # my name is jsh and i am 24

## ex4
t = Template("i have a dict {{mydict}}")
msg = t.render(mydict={"a":1, "b":2})
print(msg)  # i have a dict {'a': 1, 'b': 2}

## ex5
t = Template("this is a test msg")
msg = t.render()
print(msg) # this is a test msg

通过render来渲染得到最终的输出

Jinja objects

class Person:
    def __init__(self, name, age):
        self.__name = name
        self.__age = age
    def getAge(self):
        return self.__age
    def getName(self):
        return self.__name
    
p = Person('jsh', 24)
tm = Template("my name is {{p.getName()}} and I am {{p.getAge()}}")
msg = tm.render(p=p)
print(msg)  # my name is jsh and I am 24

p.name和p[‘name’]都可以访问字典中的数据

Jinja Dictionaries

person = {'name':'jsh', 'age':24}
t1 = Template("my name is {{p.name}} and i am {{p.age}}")
t2 = Template("my name is {{p['name']}} and i am {{p['age']}}")
msg = t1.render(p=person)
msg2 = t2.render(p=person)
print(msg)  # my name is jsh and i am 24
print(msg2) # my name is jsh and i am 24

Jinja raw data

可以使用raw, endraw对Jinja定界符进行专业

data = """
{% raw %}
his name is {{name}}
{% endraw %}
"""
tm = Template(data)
msg = tm.render(name='jsh')
print(msg)  # his name is {{name}}

可以看出,通过使用raw,endeaw, 对Jinja的{{}}进行了专业,输出了原始的内容

Jinja escape data

为了对<或者>符号进行转义,可以使用过滤器或者escape函数

from jinja2 import escape
data = '<a> this is a sunny day </a>'
tm = Template("{{data | e}}")
msg = tm.render(data=data)
print(msg)           # &lt;a&gt; this is a sunny day &lt;/a&gt;
print(escape(data))  # &lt;a&gt; this is a sunny day &lt;/a&gt;

过滤器通过|符号使用,通过使用e过滤器, <和>符号被转义
escape函数有相同的效果

Jinja for expressions

persons = [
    {"name":'alice', 'age':10},
    {"name":"bob", 'age':11},
    {"name":"cnady", 'age':12},
    {"name":"dandy", 'age':13}
]
template = "{% for person in persons%} {{person.name}} {{person.age}} {%endfor%}"
t = Template(template)
msg = t.render(persons=persons)
print(msg) #  alice 10  bob 11  cnady 12  dandy 13 

在上面的例子中,我们使用for表达式对persons进行迭代,显示name和age。

template = "{% for person in persons%} {% if person.age < 13 %}{{person.name}} {{person.age}} {%endif%}{%endfor%}"
t = Template(template)
msg = t.render(persons=persons)
print(msg) #  alice 10  bob 11  cnady 12  

通过条件判断语句person.age<13进行判断, 注意{% if %}和{% endif %}

Jinja filter

过滤器可以用来对数据进行修改,例如sum filter可以对数据求和, escape filter可以对数据进行转义,sort filter可以对数据进行排序, default filter 可以给数据提供默认值

# sum filter
cars = [
    {'name':'audi', 'price':10},
    {'name':'skoda', 'price':13},
    {'name':'volvo', 'price':44}
]
template = "the sum of car prices is {{cars|sum(attribute='price')}}"
tm = Template(template)
msg = tm.render(cars=cars)
print(msg) # the sum of car prices is 67

# default filter
template = "hello {{name|default('jsh')}}"
tm = Template(template)
msg = tm.render()
print(msg)  # hello jsh
msg = tm.render(name='bob')
print(msg) # hello bob

更多内容请见官方文档https://jinja.palletsprojects.com/en/master/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值