模板过滤器-Jinja2->控制语句

模板过滤器

过滤器是通过管道符号(|)进行使用的。例如: {{ name|length }}, 将返回name的长度,过滤器相当于是一个函数,把当前的变量出入到过滤器中,然后过滤器根据自己的功能,再返回响应的值,之后再将结果渲染到页面中,Jinja2中内置了许多的过滤器,再这里可以看到所有的过滤器:

  • abs(value): 返回一个数值的绝对值
  • default(value,default_value,boolean=false):如果当前变量没有值,则会使用参"数中的值来代替。name|default(‘happy’)—如果name不存在,则会使用happy来替代。Boolean=False默认是在只有这个变量为undefined的时候才会使用default中的值,如果想使用python的形式判断是否为false,则可以传递Boolean=true。也可以使用or来替换。
  • escape(value)或e:转义字符,会将<、>等符号转义成HTML中的符号。例如:content|escape或content|e。
  • first(value):返回一个序列的第一个元素。name|first。
  • format(value,*args,**kwags):格式化字符串。例如一下代码:
{{%s" - "%s"|format{"hello?","Fool") }}将输出:hello? - Fool
  • last(value):返回一个序列的最后一个元素。例如:names|last。
  • length(value):返回一个序列或者字典的长度。例如:names|length。
  • join(value,d=u"):将一个序列用d这个参数的值拼接成字符串。
  • safe(value):如果开启了全局转义,那么safe过滤器会将变量关掉转义。示例:content_heml|safe。
  • int(value):将值转换为int类型
  • float(value):将数值转化为float类型
  • lower(value): 将字符串转化为小写
  • uppwe(value): 将字符串转换为大写
  • replace(value,old,new):替换将old替换为new的字符串
  • truncate(value,length=255,killwords=False): 截取length长度的字符串
  • stripags(value):删除字符串中所有的HTML标签,如果出现多个空格,将替换成一个空格。
  • trim:截取字符串前面和后面的空白字符
  • string(value):将变量转换为字符串
  • wordcount(s):计算一个长字符串中单词的个数(按照空格计算单词个数)
@app.route("/")
def index():
    context = {
        "username": "hello happy",
        "age": -18,
        "name": "haha" ,   # 可用Boolean类型来判断是否有值
        "es": "<script>alert('xixihaha');</script>",
        "books": ["Python","Java","PHP"]
    }
    return render_template("index.html", **context)
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    <h1>首页</h1>
    <p>{{ username }}</p>
    <p>{{ age|abs }}</p>
    <p>{{ name|default('这个人很懒,什么都没有留下。。。')}}</p>
    <!--    自动转义-->
<!--    <p>{{ es }}</p>-->
<!--    关闭自动转义-->
<!--    {% autoescape off %}-->
<!--        <p>{{ es }}</p>-->
<!--    {% endautoescape %}-->
<!--    标记这个字符串是安全的-->
    <p>{{ es|safe }}</p>
    <P>{{ books|first}}</P>
    <P>{{ books|last}}</P>
    <P>{{ books|length}}</P>
    <P>{{ books|first|length}}</P>
    <p> {{ username|replace("hello", "hi") }}</p>
<!--    不会报错,但是没有显示,只有语法层面报错,才会在页面显示-->
    <p>{{ abc|replace("hello", "hi") }}</p>
<!--    用于文章标题,长度要大于等于3-->
    <p>{{ username|truncate(length=5) }}</p>
    <p>{{ es|striptags }}</p>


</body>

</html>

自定义过滤器

from flask import Flask, render_template
from datetime import datetime

@app.template_filter("handle_time")
def handle_time(time):
    '''
    小于1分钟 =》刚刚
    大于1分钟小于1小时=》xx分钟之前
    大于1小时小于24小时=》xxx小时之气那
    :param time:
    :return:
    '''
    if isinstance(time, datetime):
        now = datetime.now()
        # total_seconds 得到总秒数
        timestamp = (now - time).total_seconds()
        if timestamp <60:
            return "刚刚"
        elif timestamp >=60 and timestamp <=60*60:
            return "%s分钟之前" % int(timestamp/60)
        elif timestamp >=60*60 and timestamp <=60*60*24:
            return "%s小时之前" % int(timestamp/(60*60))
        else:
            return time
<p>文章发表的时间:{{ now_time|handle_time }}</p>

控制语句

所有的控制语句都是放在{%…%}中,并且有一个语句{% endxx %}来进行结束,Jinja中常用的控制语句有if/for…in…
if:i f语句和python中的类似,可以使用>,<,<=,>=,==,!=来进行判断,也可以通过and. or not, ()来进行逻辑合并操作

{% if kenny.sick %}
	kenny is sick.
{% elif kenny.dead %}
you killed kenny! you bastard!!!
{% else %}
keeny looks okay ---so far
{% endif %}

for…in…:for循环可以遍历任何一个序列包括列表、字典、元组,并且可以进行方向遍历
遍历列表:

def index():
    context = {
        "username": "hi happy",
        "books": ["python", "java","php"],
            }

    }
    return render_template("if_for.html", **context)
{% for book in books %}
    <p>{{ book }}</p>
{% endfor %}

遍历字典:

def index():
    context = {
        "username": "hi happy"

        "users":{
            "name": "xingyue",
            "age": 18,
            "addr": "henan"
        }

    }
    return render_template("if_for.html", **context)
{% for key,value in users.items() %}
    <p>{{ key}}</p>
    <p>{{ value }}</p>
{% endfor %}

在Jinja中的for循环还包含一下变量,可以用来获取当前的遍历状态
loop.index: 当前迭代的索引(从1开始)
loop.index() : 当前迭代的索引(从0开始)
loop.first :是否是第一次迭代
loop.last:是否是最后一次迭代,返回true或false
loop.length: 序列的长度
另外,不可以使用continue和break表达式来控制循环的执行。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值