Jinja 模板引擎

本文介绍了如何在Flask应用中使用Jinja2模板引擎,包括渲染模板、向模板传递参数、在模板中使用if控制语句和for循环,以及过滤器的使用。详细讲解了render_template函数的使用方法,强调了模板文件的位置和变量传递的匹配,以及在模板中避免多层if...else...嵌套。同时,还涵盖了Jinja2的for循环内置常量以及过滤器的分类和自定义过滤器的概念。

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

 

 

---模板引擎概述及使用---

 

概述:

模板实质上是一个静态的包含HTML语法的全部或片段的文本文件,也可以包含变量表示的动态部分,使用真实值替换网页模板的变量生成对应的数据的HTML片段。这一过程称为渲染。Flask提供了Jinja 2 模板引擎来渲染模板。

1.实例:

1.先创建一个HTML文档

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>这是首页</title>
    <h1>杨柳依依</h1>>
</head>
<body>

</body>
</html>

2.创建一个xxx.py文件

from flask import Flask,render_template     #导入render_template

app=Flask(__name__)                         #初始化

@app.route('/')                             #定义路由
def index():                                #定义视图函数
    return render_template('index.html')    #用render_template渲染模板
if __name__ == '__main__':
    app.run(debug=True)                     #调试模式

重点:

1.Flask通过render_template()函数来实现渲染模板,要使用Jinja2 模板引擎,需要先导入render_template,在视图函的return()函数中,render_template函数的首个参数声名使用哪一个模板文件。注意:函数中,首个参数声名使用哪个静态文件,还可以有多个参数。

2.程序会默认在当前文件夹下的template目录下寻找模板文件,所以文件夹名称不能更改。但是,如果要改需也可以。如下:

from flask import Flask,render_template     #导入render_template

app=Flask(__name__,template_folder="F:\\templates") #template_folder关键字后面跟自定义文件路径

使用template_folder关键字然后后面跟自定义的文件路径名称。

2.向模板中传递参数

Flask 提供JinJa 2模板引擎来渲染模板的同时,还可以将程序中的的参数或者变量值传递给指定的模板进行渲染

示例:

1.创建一个user.html文件

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>这里是地球</title>
    <h1>你好欢迎你来到地球</h1>
</head>
<body>

</body>
</html>

2.在创建一个index.html文件

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>这是首页</title>
    <h1>欢迎来到地球: {{ name }} </h1>    #传递参数
</head>
<body>

</body>
</html>

3.创建一个xxx.py文件


from flask import Flask,render_template     #导入render_template

app=Flask(__name__) #后面跟自定义文件路径

@app.route('/')                             #定义路由
def index():                                #定义视图函数
    return render_template('user.html')    #用render_template渲染模板
@app.route('/user/<username>')             #定义路由
def user(username):                        #定义视图函数
    return render_template('index.html',name=username)  #渲染并向模板中传递参数
if __name__ == '__main__':
    app.run(debug=True)                     #调试模式

render_template函数第一个参数指定模板文件的名称,第二个参数为可选项,可以为空。第二个参数不为空的话一般用与向模块中传递变量。传递变量一般以键值对方式进行。

模板中接收变量值,需要把变量放在{{}}中,模板中如果要写注释,格式为{#xxxx#}

如果视图函数中有多个变量值都需要传递给模板,可以使用**locals()方法

@app.route('/')
def index():
    title='窗前明月光'
    author='李白想婆娘'
    return render_template('index.html',**locals())  #使用**locals()方法进行传递多个
    

注意:传递参数的时候视图函数下的变量名要和html文档中的参数传递名要相同。

2.模板中if控制语句

在模板引擎中,if 放在{% %}

语法:

{% if name%}
{% elif %}
{% else %}
{%endif%}

示列:

1.创建index.html文件

    <meta charset="UTF-8">
    <title>这是首页</title>
</head>
<body>
{% if name%}
<h3>产生的随机数有效</h3>
{% else %}
<h4>产生的随机数无效!</h4>
{%endif%}

</body>
</html>

2.创建xxx.py文件

from flask import Flask,render_template
import random

app=Flask(__name__) 

@app.route('/')                             #定义路由
def index():                                #定义视图函数
    randoms=random.randint(0,1)                    #0-1范围内的整形数
    return render_template('index.html',name=randoms)    # 传递参数

注意:在模板中尽量少用多层镶嵌的if...else...语句,往往会因为缩进出现很多的问题,尽量多使用if ...elif...else...的结构,这一系列条件判断会从上到下以此判断,如果判断为真,则执行对应的代码块,后面的条件就会直接忽略。不在执行。

3.模块中的for 循环

在模块中使用for 也是和if一样是放在{% %}中

语法:

{% for 目标 in 对象 %}
<p>目标</p>
{% endfor %}

Jinja 2 在for 循环中的内置常量

  • loop.index:当前迭代的索引(从1开始)
  • loop.index():当前迭代的索引从(从0开始)
  • loop.first:是否是第一次迭代,返回真或者假
  • loop.last:是否是最后一次迭代,返回真或假
  • loop.length:返回序列的长度

注意:不可以使用continue 和break来控制循环的执行。

示列:

1.创建一个user.html文件

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>这里是地球</title>
    <h1>你好欢迎你来到地球</h1>
</head>
<body>
<table>
    <tr>
    <th>商品名称</th>
    <th>商品价格</th>
    </tr>
    {% for good in good %}
       <tr>
        <td>{{good.trousers}}</td>
        <td>{{good.price}}</td>
       </tr>
    {% endfor %}
</table>
</body>
</html>

2.创建一个xxx.py文件

from flask import Flask,render_template
import random

app=Flask(__name__)

@app.route('/')
def index():
    good=[
        {'trousers':'开裆裤','price':100},{'trousers':'连体裤','price':200},
        {'trousers':'短裤','price':500}
    ]
    return render_template('user.html',**locals())
if __name__ == '__main__':
    app.run(debug=True)

注意:通过{%表达式%}可以是实现代码的镶嵌,语法和基本一致,但是都要包含在{% %}中。

 

Flask过滤器

说明:过滤器本质上是一个转换函数,有时候不仅需要输出变量的值,还要把某个变量的值修改后显示出来,而在模板中不能直接调用python中的某些方法。所以可以使用过滤器。

1.与字符串相关的过滤器

<p>{{ name|default('None',ture) }}</p>
其中,name为变量名,如果name为空,则用None值去替代。
<p>{{ 'hell'|capitalize }}</p>
将字符串hell转换为首字母大写的目的。
<p>{{ 'HELLO'|lowere }}</p>
将字符串HELLO全部转换为小写
<p>{{ 'hello'|replace('h','x') }}</p>

2.与列表相关的过滤器

<p>{{ [1,2,3,4]|first }}</p>
获得列表中的首个元素
<p>{{ [0,1,2,3]|last }}</p>
获得列表元素中的最后一个
<p>{{ [1,2,3,4]|count}}</p>
获得列表元素中的个数
<p>{{ [1,2,3,4] |sort}}</p>
对列表中的元素进行排序
<p>{{ [2,3,4,5]|join('') }}</p>
对列表中的元素合并为字符串

3.与数值相关的过滤器

<p>{{ 111.22222|round }}</p>
四舍五入取整数
<p>{{ 18.8888|round(2,floor) }}</p>
保留小数点后面两位
<p>{{ -2|abs }}</p>
返回绝对值

自定义过滤器

app.add_template_filter()#第一个参数为函数名,第二个参数为过滤器名。

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值