Jinjia模板过滤器、自定义模板过滤器、宏、继承和导入模板

1.模板过滤器模板过滤器是在html模板中对渲染数据进行处理的一种方法,过滤器是通过管道符号(|)进行使用的,例如:{{ name|length }},将返回name的长度。过滤器相当于是一个函数,把当前的变量传入到过滤器中,然后过滤器根据自己的功能,再返回相应的值,之后再将结果渲染到页面中。例如,我们新建一个app.py实例文件,from flask import Flask, rende...
摘要由CSDN通过智能技术生成

1.模板过滤器

模板过滤器是在html模板中对渲染数据进行处理的一种方法,过滤器是通过管道符号(|)进行使用的,例如:{ { name|length }},将返回name的长度。过滤器相当于是一个函数,把当前的变量传入到过滤器中,然后过滤器根据自己的功能,再返回相应的值,之后再将结果渲染到页面中。

例如,我们新建一个app.py实例文件,

from flask import Flask, render_template

app = Flask(__name__)
app.config.update({
   
    'DEBUG': True,
    'TEMPLATES_AUTO_RELOAD': True
})
# 修改配置文件,开启DEBUG模式和自动重新加载

@app.route('/')
def age_filter():
    content = {
   
        'name': 'zhangsan',
        'age': '18'
    }
    return render_template('filter.html', **content)


if __name__ == '__main__':
    app.run()

再新建一个filter.html文件,

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>过滤器</title>
</head>
<body>
{
   % if age | int >= 18 %}  // 将age变量的值转换为int类型
    <h3>{
   {
    name | upper }}是成年人</h3>  // 将name属性值大写
{
   % else %}
    <h3>{
   {
    name | upper }}是未成年人</h3>
{
   % endif %}
</body>
</html>

这样,页面中的name会大写显示。

以下是一些常用的模板过滤器,

名称 作用
abs(value) 返回一个数值的绝对值
default(value,default_value,boolean=false) 如果当前变量没有值,则会使用参数中的值来代替
escape(value)或e 转义字符,会将<、>等符号转义成HTML中的符号
first(value) 返回一个序列的第一个元素
format(value,*arags,**kwargs) 格式化字符串
last(value) 返回一个序列的最后一个元素
length(value) 返回一个序列或者字典的长度
join(value,d=u’’) 将一个序列用d这个参数的值拼接成字符串
safe(value) 如果开启了全局转义,那么safe过滤器会将变量关掉转义
int(value) 将值转换为int类型
float(value) 将值转换为float类型
lower(value) 将字符串转换为小写
upper(value) 将字符串转换为大写
replace(value,old,new) 替换将old替换为new的字符串
truncate(value,length=255,killwords=False) 截取length长度的字符串
striptags(value) 删除字符串中所有的HTML标签,如果出现多个空格,将替换成一个空格
trim 截取字符串前面和后面的空白字符
string(value) 将变量转换成字符串
wordcount(s) 计算一个长字符串中单词的个数

这里我们介绍一下,safe过滤器。

我们有时需要接收从服务器上传来的代码并运行,由于flask框架中为了防止xss攻击等恶意行为,默认自动开启了全局转义,也就是把一些特殊字符串转义为安全的字符串,这样,就可以避免一些攻击,但是,我们从主服务器上传来的代码也同样被转义了,因此,我们可以使用safe过滤器来取消局部转义。

例如,新建一个app.py实例文件,

from flask import Flask, render_template

app = Flask(__name__)
app.config.update({
   
    'DEBUG': True,
    'TEMPLATES_AUTO_RELOAD': True
})


@app.route('/safe/')
def server_code():
    content = {
   
        'code': '<script>alert("服务器代码")</script>'
    }  # code为服务器传递的代码,该代码需要在html页面中运行
    return render_template('safe.html', **content)


if __name__ == '__main__':
    app.run()

safe.html代码如下,

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>safe</title>
</head>
<body>
    {
   {
    code | safe }}  // 将code内容取消转义
</body>
</html>

上面是一种取消转义的方法,下面的代码同样可以起到相同的作用,

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>safe</title>
</head>
<body>
    {
   % autoescape false %}  // 取消自动转义
        {
   {
    code }}
    {
   % endautoescape %}
</body>
</html>

2.自定义模板过滤器

由于需求的不同,模板过滤器可能无法满足我们的使用,这是我们需要自定义模板过滤器来实现需求。

自定义的模板过滤器实质上是一个函数,该函数最多只能有两个参数。自定义模板过滤器需要在模板中进行加载方可使用。

例如,我们想要实现一个查看指定日期距离当前时间的时间间隔的功能,如果时间间隔小于1分钟,则显示刚刚;时间间隔大于1分钟小于1小时,则显示几分钟前;时间间隔大于1小时小于24小时,则显示几小时前;时间间隔大于24小时小于30天,则显示几天前;时间间隔超过30天,显示年月日时分秒。

我们首先新建一个app.py实例文件,代码如下,

from flask import Flask, render_template
from datetime import datetime

app = Flask(__name__)
app.config.update({
   
    'DEBUG': True,
    'TEMPLATES_AUTO_RELOAD': True
})


@app.route('/time/')
def show_time():
    content = {
   
        'time': datetime(2020, 4, 12, 13, 0, 0)
    }
    return render_template('timeframe.html', **content)


@app.temp
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值