Jinja2模板引擎(一)


简介
在flask框架中通常使用Jinja2模板引擎来实现复杂页面的渲染。
本章主要介绍Jinja2模板引擎的基本结构和使用方法。

  • 如何使用flask框架渲染模板
  • 在模板中传递一个或者多个参数
  • if语句在模板中的运用
  • for语句在模板中的使用
    模板的实质上是一个静态包含HTML语法的全部或者片段的文本,也可包含由变量表示的动态部分
from flask import Flask  # 导入flask框架模板
from flask import render_template#导入render_template模块
app = Flask(__name__)  # flask实例化
@app.route('/')  # 定义路由
def index():  # 定义试图函数
    return render_template('index.html')  # 返回值,使用render_template方法渲染模板
@app.route('/user/')  # 定义路由,传递的参数名是,需要在函数的形参中定义同名的参数
def user(username):#定义视图函数
    return render_template('user.html')  # 渲染
if __name__ == '__main__':  # 运行
    app.run(debug=True)

注意:在templelates的文件下创建index.html和user.html,加载并且自行测试渲染。flask框架是通过render_template()函数来实现模板的渲染,要使用Jinja2模板引擎,需要使用from flask render_template命令导入render_template函数。
向模板中传递参数
flask 提供Jinja2模板来渲染模板的同时,还可以将程序中的参数或变量传递到指定的模板进行渲染
inde.html(值写出了不同的部分)

这是首页<\title>
<h1>首页中的文字<\h1>
</code></pre>
<p>user.html</p>
<pre><code><title>这是用户中心<\title>
<h1>欢迎您:{{name}}<\h1>
</code></pre>
<p>app.py</p>
<pre><code>from flask import Flask  # 导入flask框架模板
from flask import render_template#导入render_template模块
app = Flask(__name__)  # flask实例化
@app.route('/')  # 定义路由
def index():  # 定义试图函数
    return render_template('index.html')  # 返回值,使用render_template方法渲染模板
@app.route('/user/<username>')  # 定义路由,传递的参数名是<username>,需要在函数的形参中定义同名的参数
def user(username):#定义视图函数
    return render_template('user.html',name=username)  # 渲染
if __name__ == '__main__':  # 运行
    app.run(debug=True)
#render_template()函数第一个参数是指定模板文件的名称,第二个参数一般用于传递变量。
</code></pre>
<p>模板中接收变量值,需要把变量值放在{{}},如{{val}}等。模板中如果要写注释的话个格式为<code>{##}</code>如<code>{#br表示的是回车}</code><br>
如果视图函数中有多个变量值,都需要传递给模板,可以使用**locals()方法。</p>
<pre><code>def index():
    #return render_template('index.html')
    title='python键值对'#定义键值
    author='tom_jack'#定义键值
    return render_template('index.html',**locals)#渲染模板并传值**locals可以换成x=title,y=author页面中要有x,y变量。
</code></pre>
<p>主要如果使用**locals方法,此时模块中的{{title}}和{{author}}来可以直接使用。<br>
<strong>模板之中的if控制语句</strong><br>
在Jinja2引擎模板中也可以使用if和for循环控制语句,控制模板的渲染的方向。</p>
<pre><code>{%if condition %} <!--condition是指的是条件>
{% else %}<!--条件不满足>
{% endif %}<!--结束if语句> 
</code></pre>
<p>index.html</p>
<pre><code><body>
{%if name %}<!--name值是否存在>
<h1>产生随机有效数</h1>
{%else%}<!-- name值不存在>
<h1>产生的随机数无效</h1><!-- name值不存在,则输出产生的随机数>
</body>
{{name}}
</code></pre>
<p>app.py</p>
<pre><code>@app.route('/')
def hello world():
    rand1=random.randint(0,1)
    return render_template('index.html',name=rand1)
</code></pre>
<pre><code>{%if condition %} <!--condition是指的是条件>
{% elif %}<!-- 其他的条件>
{% else %}<!--条件不满足>
{% endif %}<!--结束if语句>
</code></pre>
<p>index.html</p>
<pre><code><body>
{%if name==1%}
<h1>恭喜你抽取一等奖</h1>
{%elif name==2%}
<h1>恭喜你抽取二等奖</h1>
{%else%}
<h1>恭喜你抽取三等奖</h1>
{%endif%}
{{name}}
</body>
</code></pre>
<p>app.py</p>
<pre><code>@app.route('/')
def hello world():
    rand1=random.randint(1,3)
    return render_template('index.html',name=rand1)
</code></pre>
<p>在模板中要尽量少使用if..else...语句,应该尽量多使用if..elif...else...的结构(多个elif)<br>
<strong>注意:</strong></p>
<ul>
<li>模板中的表达式的分隔符{{}}内的</li>
<li>控制语句都是包含在{%%}</li>
<li>模板中的注释符{##}</li>
</ul>
<p><strong>模板中的控制语句之for语句</strong></p>
<pre><code>for 目标 in 对象
循环体
在模板中
{% for 目标 in 对象%}
<p>目标</p>
<% endfor %>
</code></pre>
<p><strong>Jinja2中for循环常量</strong></p>
<ul>
<li>loop.index:当前迭代的索引(从1开始)</li>
<li>loop.index0:当前迭代索(从0开始)</li>
<li>loop.first:是否是第一次迭代</li>
<li>loop.last:是否是最后一次迭代</li>
<li>loop.length:返回序列的长度<br>
shop.html</li>
</ul>
<pre><code><!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title


>
    
{% for goods in goods %}

{% endfor %}
商品名称 商品的价格
{{ goods.name }} {{ goods.price }}

app.py

from flask import Flask  # 导入flask框架模板
from flask import render_template
app = Flask(__name__)  # flask实例化
@app.route('/')  # 定义路由
def index():  # 定义试图函数
    goods = [{'name': '秋装上衣', 'price': 100},
             {'name': '西装上衣', 'price': 190},
             {'name': '新款上衣', 'price': 180}]
    return render_template('shop.html', **locals())
if __name__ == '__main__':  # 运行
    app.run(debug=True)

注意:使用if条件判断语句或者是for循环的语句,可以帮助开发者更好的渲染模板,通过{% 逻辑表达式%},可以实现代码的嵌套,其语法与python的语法基本一致,但是必须包含在{% %}内部
flask过滤器
过滤器的本质是一个转换函数,有时候我们不仅要输出变量的值,还需要把某个变量的值修改之后显示出来。
1.与字符串相关的过滤器

  • {{name|default('none'true)}}

    其中name是变量名,name为空则为None
  • {{'hello'|capitalize}}

    将字符串实现首字母大写
  • {{'HELLO'|lowere}}

    将全部的字符串转换成为小写
  • {{'hello'|replace('h','x')}}

    将hello中的小写字母转换成为x

2.对列表进行相关操作的过滤器

  • {{[01,80,42,44,77]|first}}

    取得列表中的首个元素01
  • {{[01,80,42,44,77]|last}}

    取得列表中的最后一个元素
  • {{[01,80,42,44,77]|count}}

    取得列表中的元素的个数count也可以使用length来替代
  • {{[01,80,42,44,77]|sort}}

    对列表中元素进行重新排序,默认是按照升序进行排序
  • {{[01,80,42,44,77]|join.(',')}}

    将列表的元素合并为字符串

3.对数值进行相关操作的过滤器

  • 1{{0.8888|round}}

    四舍五入取得整数
  • {{10.9999|round(2,'floor')}}

    保留小数点的后两位
  • {{-2|abs}}求绝对值运算,返回结果为2

自定义过滤器
通过调用add_template_filter方法实现自定义过滤器,改方法第一个是函数名,第二个是自定义过滤器的名称