jinja2的模板过滤器引用及自定义

一、jinja2模板过滤器

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

1、 abs(value):返回一个数值的绝对值。

2、default(value,default_value,boolean=false):如果当前变量没有值,则会使用参数中的值来代替。

name|default(‘juran’)——如果name不存在,则会使用juran来替代。boolean=False默认是在只有这个变量为undefined的时候才会使用default中的值,如果想使用python的形式判断是否为false,则可以传递boolean=true。也可以使用or来替换。

3、 escape(value)或e:转义字符,会将<、>等符号转义成HTML中的符号。

示例:content|escape或content|e。

4、 first(value):返回一个序列的第一个元素。

示例: names|first。

5、 format(value,*arags,**kwargs):格式化字符串。

例如以下代码: { { “%s” - “%s”|format(‘Hello?’,“Foo!”) }}将输出:Helloo? - Foo!

6、 last(value):返回一个序列的最后一个元素。

示例:names|last。

7、 length(value):返回一个序列或者字典的长度。

示例:names|length。

8、join(value,d=u’’):将一个序列用d这个参数的值拼接成字符串。

9、 safe(value):如果开启了全局转义,那么safe过滤器会将变量关掉转义。

示例:content_html|safe。

10、 int(value):将值转换为int类型。

11、 float(value):将值转换为float类型。

12、lower(value):将字符串转换为小写。

13、 upper(value):将字符串转换为小写。

14、replace(value,old,new): 替换将old替换为new的字符串。

15、 truncate(value,length=255,killwords=False):截取length长度的字符串。

16、striptags(value):删除字符串中所有的HTML标签,如果出现多个空格,将替换成一个空格。

17、 trim:截取字符串前面和后面的空白字符。

18、string(value):将变量转换成字符串。

19、wordcount(s):计算一个长字符串中单词的个数。

二、自定义过滤器

1、过滤器定义:

@app.template_filter(“过滤器名称”)
def 过滤器名称(参数)
实现的功能

2、过滤器的引用:

  • 与系统过滤器引用方法一样,
    • { {变量名|过滤器名称}}
    • { {变量名|过滤器名称(参数)}}

三、实例

1、代码:

from flask import Flask,render_template
from datetime import datetime

app=Flask(__name__)

@app.route('/')
def index():
    context = {
    
    
        'username': 'hello 老萝卜',
        'age': -18,
        'home': '湖北',
        'recommend': 'chinapost',    # 删除后,应显示缺省值
        'es': "<script>alert('hello    everyone');</script>",
        'books': ['Python', 'Java', 'PHP'],
        'book': {
    
    'Python': 666},
        'address': '中国   湖北省   武汉市      东西湖区',
        'now_time': datetime(2020, 10, 14, 21, 7, 0)
    }
    return render_template('demo_jinja2filter.html', **context)   # 引用模板

# 自定义过滤器
@app.template_filter('my_filter')
def my_filter(value):
    return value.replace('hello', '')

@app.template_filter('handler_time')
def handler_time(time):
    """
    小于一分钟---->刚刚
    大于一分钟小于一小时---->xxx分钟之前
    大于一小时小于24小时----> xxx小时之前
    """
    now = datetime.now()
    # 获取总秒数
    timestamp = (now - time).total_seconds()

    if isinstance(time, datetime):
        if timestamp < 60:
            return '刚刚'
        elif 60 <= timestamp <= 60*60:
            return '%s分钟之前' % int(timestamp/60)
        elif 60*60 < timestamp <= 60*60*24:
            return '%s小时之前' % int(timestamp/(60*60))
    else:
        return time


if __name__=="__main__":
    app.run(debug=True)

2、模板

模板一般放在./templates目录上,建议不要随便改目录

#./templates/demo_jinja2filter.html
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Jinja2过滤器演示</title>
</head>
<body>
    <h1>首页</h1>
    用户姓名:{
    
    {
    
     username }}
    <p>年龄: {
    
    {
    
     age|abs }} (原值:{
    
    {
    
    age}}</p>
    <p>{
    
    {
    
     name|default('这个人很懒,什么都没有留下') }}</p>
    {
    
    % autoescape off %}
     <p>{
    
    {
    
     es }}</p>
    {
    
    % endautoescape %}
    <p>{
    
    {
    
     es|safe }}</p>
    <p>返回一个序列{
    
    {
    
    books}}的第一个元素:{
    
    {
    
     books|first }}</p>
    <p>返回一个序列{
    
    {
    
    books}}的最后一个元素:{
    
    {
    
     books|last }}</p>
    <p>返回一个序列{
    
    {
    
    books}}的长度:{
    
    {
    
     books|length }}</p>
    <p>返回一个字典{
    
    {
    
    book}}的长度:{
    
    {
    
     book|length }}</p>
    <p>返回一个序列{
    
    {
    
    books}}的第一个元素长度:{
    
    {
    
     books|first|length }}</p>
    <p>字符串{
    
    {
    
    username}}替换"replace('萝卜', 'luobo')"{
    
    {
    
     username|replace('萝卜', 'luobo') }}</p>
    <p>字符串{
    
    {
    
    username}}截取:{
    
    {
    
     username|truncate(length=5) }}</p>
    <p>删除字符串"{
    
    {es}}"中所有的HTML标签,如果出现多个空格,将替换成一个空格:{
    
    {
    
     es|striptags }}</p>
    <p>计算一个长字符串"{
    
    {address}}"中单词的个数:{
    
    {
    
     address|wordcount }}</p>
    <p>{
    
    {
    
     username|my_filter }}</p>
    <p>博客发表时间:{
    
    {
    
     now_time|handler_time }}</p>
</body>
</html>

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/laoluobo76/article/details/109095318