Jinja2 - 从零开始学模板引擎
说真的,第一次接触 Jinja2 的时候我也是一脸懵。不过用着用着就发现,这玩意儿简直就是写模板的神器啊!它不光能生成 HTML,还能用来生成各种文本文件,比如配置文件、邮件模板啥的。看完这篇,保证你也能上手这个强大的模板引擎。
基本语法长啥样
Jinja2 的语法其实挺好记的。模板里面用{{ }}
来放变量,用 {% %}
来写控制语句。我写个最简单的例子: from jinja2 import Template
template = Template('哈喽,{{ name }}!')
result = template.render(name='小明')
print(result) # 输出:哈喽,小明!
🌟 温馨提示:变量名区分大小写,写错了就渲染不出来啦!
模板继承真好使
写网页的时候老发现有些部分是重复的,比如导航栏、页脚这些。用 Jinja2 的模板继承就能解决这个问题: {# base.html #}
<!DOCTYPE html>
<html>
<head>
{% block head %}
<title>{% block title %}{% endblock %}</title>
{% endblock %}
</head>
<body>
{% block content %}{% endblock %}
</body>
</html>
{# page.html #}
{% extends “base.html” %}
{% block title %}我的页面{% endblock %}
{% block content %}
<h1>这是内容</h1>
{% endblock %}
刷新新标签页
分享
控制台
关闭控制台
过滤器玩出花
过滤器就像是个小魔法师,能把数据变来变去。用法可简单了,就是在变量后面加个竖线,然后接上过滤器名: {# 把字符串变大写 #}
{{ name|upper }}
{# 去掉两边空格 #}
{{ text|trim }}
{# 还能串着用 #}
{{ name|lower|trim }}
我经常用的几个过滤器:
default :变量不存在时用默认值 length :算长度 first :取第一个元素 random :随机选一个
控制结构随心所欲
if 判断和 for 循环也都支持,写起来跟 Python 差不多: {% if user.is_logged_in %}
<p>欢迎回来,{{ user.name }}!</p>
{% else %}
<p>请先登录</p>
{% endif %}
<ul>
{% for item in items %}
<li>{{ item }}</li>
{% endfor %}
</ul>
🌟 温馨提示:别忘了结束标签,不然会报错。我就经常忘记写 endif...
宏:代码复用小能手
宏就像是函数,可以重复使用一段模板代码: {% macro input(name, type='text') %}
<input type=“{{ type }}” name=“{{ name }}” value=“”>
{% endmacro %}
{# 使用宏 #}
{{ input('username') }}
{{ input('password', type='password') }}
写个表单什么的特别方便,代码看着也整洁。
全局函数不可少
Jinja2 自带了一些好用的全局函数:range :生成数字序列 dict :创建字典 lipsum :生成假文本(写demo的时候特别好用)
{% for n in range(1, 4) %}
<p>这是第{{ n }}段</p>
{% endfor %}
最骚的是还能自己加全局函数。我就写过一个格式化日期的:
def format_date(value):
return value.strftime('%Y-%m-%d')
env.globals['format_date'] = format_date
看完这些,Jinja2 基本就掌握得差不多了。写模板的时候记得多试试,有啥问题就查文档,慢慢就熟练了。代码写多了自然就有感觉,模板引擎真的能帮咱们省不少事。