「Flask笔记」 jinja2模板之过滤器

栏目: Python · 发布时间: 5年前

内容简介:需要对传入模板的变量做一些处理的时候,那么就可以用到过滤器。语法:简单的小例子,删除传入字符中的执行字符

flask -- jinja2模板之过滤器

需要对传入模板的变量做一些处理的时候,那么就可以用到过滤器。

语法: {{var | 过滤器名称}} ,使用管道符连接

常用过滤器

  • abs(value) :返回一个数值的绝对值。例如: -1|abs
  • default(value,default_value) :如果当前变量没有值,则会使用参数中的值来代替。 name|default('hello world') ,如果 name 不存在,则会使用 hello world 来代替。 boolean=False 默认是在只 有这个变量为 undefined 的时候才会使用default中的值,即 None , [] , {} 等都不会使用 default 的默认值,当 boolean=True 的时候就可以使用默认来代替,或者用 name or 'hello world' 来代替 name|default('hello world',boolean=True) 默认的 booleanTrue
  • first(value) :返回一个序列的第一个元素。 name|first
  • format(value,*args,**kwargs) :格式化字符串。
  • last(value) :返回一个序列的最后一个元素。示例: names|last。
  • length(value) :返回一个序列或者字典的长度。示例: names|length
  • join(value,d='u') :将一个序列用d这个参数的值拼接成字符串
  • int(value) :将值转换为 int 类型
  • float(value) :将值转换为 float 类型
  • lower(value) :将字符串转换为小写
  • upper(value) :将字符串转换为大写
  • replace(value,old,new) :替换将 old 替换为 new 的字符串
  • truncate(value,length=253,killwords=False) :截取length长度的字符串
  • striptags(value) :删除字符串中所有的HTML标签,如果出现多个空格,将替换成一个空格
  • trim :截取字符串前面和后面的空白字符
  • string(value) :将变量转换成字符串
  • wordcount(s) :计算一个长字符串中单词的个数

自动转义过滤器

  • escape(value) 或e:转义字符,会将等符号转义成HTML中的符号。例如 content|escapecontent|e ,可以防御模板导致的xss攻击,但是不能防御 属性注入xss 如果希望防御 属性注入xss 那么必须确保属性中使用jinja表达式时,始终使用单引号或双引号包裹。如``具体可以参考jinja2的安全注意事项
  • safe(value) :如果开启了全局转义,那么 safe 过滤器会将变量关掉转义。示例: content_html|safe
  • autoescape 标签
{% autoescape off %}
 ........
{% endautoescape %}

一部分过滤器演示

# 省略初始化
@app.route('
@app.route('/')
def hello_world():
    context={
        'signature':'hello, world!',
        'sigatureNone':None,
        'script':'<script>alert("/xss/")</script>',
        'hello':'hello world',
        'article':'hello world hello world'
    }
    return render_template('index.html',**context)
<!-- 省略其他标签 -->
<p>这里是default的册数: {{ signature|default('这个人很懒,没有留下任何说明') }}</p>
<p>这里是Bool为False的测试:{{ sigatureNone|default('这个人很懒,没有留下任何说明') }}</p>
<p>这里是Bool为True的测试:{{ sigatureNone|default('这个人很懒,没有留下任何说明',boolean=True) }}</p>
<p>这里是Bool为True的测试:{{ sigatureNone or '这个人很懒,没有留下任何说明' }}</p>
<p>这里是script测试:{{ script }}</p> <!-- 默认开启了自动转义-->
{% autoescape off %} <!-- 使用这对标签,对标签内的内容关闭转义-->
<p>这里是script测试:{{ script}}</p>
{% endautoescape %}
<p>这里是script|safe测试:{{ script|safe }}</p>
<p>这里是replace测试:{{ hello|replace('world','<a href="https://www.miaoroom.com/tag/flask" data-toggle="tooltip" title="查看更多关于 flask 的文章" target="_blank">flask</a>') }}</p>
<p>这里是truncate测试:{{ article|truncate(length=5) }}</p>
<p>这是striptags测试:{{ script|striptags }}</p>

自定义过滤器

简单的小例子,删除传入字符中的执行字符

# 省略初始化
@app.template_filter('cut') #将定义的过滤器注册到jinja中
def cut(value):
   value = value.replace("hello","")
   return value
@app.route('/')
def hello_world():
    context={
       'value':'hello world hello'
    }
    return render_template('index.html',**context)
<!-- 省略其他标签 -->
<p>这是cut测试:{{ value|cut }}</p>

用自定义过滤器模拟时间显示

# 省略初始化
from datetime import datetime #导入模块

@app.route('/')
def hello_world():
    context={
        'time':datetime(2019,1,27,16,0,0)  #设置一个时间做测试
    }
    return render_template('index.html',**context)

@app.template_filter('handle_time')
def handle_time(time):
    """
    time看距离现在的时间间隔
    1.如果间隔时间小于1分钟,那么就显示"刚刚"
    2.如果是一小时以内,那么就显示"xxx分钟前"
    3.如果是24小事以内,那么就显示"xxx小时前"
    4.如果是大于24小时,小于30天以内,那么就显示"xxx天前"
    5.否则就显示具体时间
    """
    if isinstance(time,datetime):
        now = datetime.now()
        timestamp = (now-time).total_seconds()  
        #total_seconds()是获取两个时间之间的总差。seconds()方法仅获取时间差的秒数,忽略天数
        if timestamp < 60:
            return "刚刚"
        elif 60 * 60 > timestamp >= 60:
            minutes = timestamp / 60
            return "%s分钟前" % int(minutes)
        elif 60 * 60 * 24 > timestamp > 60 * 60:
            hours = timestamp / (60 * 60)
            return  "%s小时前" % int(hours)
        elif 60 * 60 * 24 * 30 > timestamp > 60 * 60 * 24:
            days = timestamp / (60 * 60 * 24)
            return "%s天前" % int(days)
        else:
            return time.strftime('%Y/%M/%d %H:%M')
<!-- 省略其他标签 -->
<p>这是handle_time测试:{{ time|handle_time }}</p>

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

高性能JavaScript

高性能JavaScript

【美】Nicholas C. Zakas(尼古拉斯.泽卡斯) / 丁琛 / 电子工业出版社 / 2015-8-1 / 65

如果你使用 JavaScript 构建交互丰富的 Web 应用,那么 JavaScript 代码可能是造成你的Web应用速度变慢的主要原因。《高性能JavaScript》揭示的技术和策略能帮助你在开发过程中消除性能瓶颈。你将会了解如何提升各方面的性能,包括代码的加载、运行、DOM 交互、页面生存周期等。雅虎的前端工程师 Nicholas C. Zakas 和其他五位 JavaScript 专家介绍......一起来看看 《高性能JavaScript》 这本书的介绍吧!

SHA 加密
SHA 加密

SHA 加密工具

Markdown 在线编辑器
Markdown 在线编辑器

Markdown 在线编辑器

RGB HSV 转换
RGB HSV 转换

RGB HSV 互转工具