美文网首页
Flask过滤器

Flask过滤器

作者: 途途途途 | 来源:发表于2021-08-13 09:13 被阅读0次

Flask过滤器分为两种,模板过滤器和自定义过滤器

顾名思义,模板过滤器是人家已经定义好的,你直接拿来使用就好了

自定义过滤器就是被人定义的你用不顺手,或者满足不了你的需求

那就自己造一个过滤器

在此之前有必要了解一下什么是过滤器?

过滤器是通过|进行使用的,它是一种特殊的占位符,告诉模板引擎这个位置的值从渲染模板时使用的数据中获取.

例如{{ name|length }},将返回name的长度,过滤器相当于是一个函数,把当前的的变量传入到过滤器中,

然后过滤器根据自己的功能,再返回相应的值,之后再渲染到模板页面中。

Jinja2能识别所有类型的变量,甚至是一些复杂的数据类型.

例如字典,列表,对象等.

从字典去取一个值:{{ mydict['key'] }}}

从列表去取一个值:{{ mylist[1] }}}

从列表去取一个带索引的值:{{ mylist['name'] }}}

从对象方法中取一个值:{{ myobj.method() }}}

接下来我们先看看Flask常用的一些内置过滤器

字符串操作

{# 当变量未定义时,显示默认字符串,可以缩写为d #}

{{ name | default('No name', true) }}

{# 单词首字母大写 #}

{{ 'hello' | capitalize }}

{# 单词全小写 #}

{{ 'XML' | lower }}

{# 去除字符串前后的空白字符 #}

{{ '  hello  ' | trim }}

{# 字符串反转,返回"olleh" #}

{{ 'hello' | reverse }}

{# 格式化输出,返回"Number is 2" #}

{{ '%s is %d' | format("Number", 2) }}

{# 关闭HTML自动转义 #}

{{ 'name' | safe }}

{% autoescape false %}

{# HTML转义,即使autoescape关了也转义,可以缩写为e #}

{{ 'name' | escape }}

{% endautoescape %}

数值操作

{# 四舍五入取整,返回13.0 #}

{{ 12.8888 | round }}

{# 向下截取到小数点后2位,返回12.88 #}

{{ 12.8888 | round(2, 'floor') }}

{# 绝对值,返回12 #}

{{ -12 | abs }}

列表操作

{# 取第一个元素 #}

{{ [1,2,3,4,5] | first }}

{# 取最后一个元素 #}

{{ [1,2,3,4,5] | last }}

{# 返回列表长度,可以写为count #}

{{ [1,2,3,4,5] | length }}

{# 列表求和 #}

{{ [1,2,3,4,5] | sum }}

{# 列表排序,默认为升序 #}

{{ [3,2,1,5,4] | sort }}

{# 合并为字符串,返回"1 | 2 | 3 | 4 | 5" #}

{{ [1,2,3,4,5] | join(' | ') }}

{# 列表中所有元素都全大写。这里可以用upper,lower,但capitalize无效 #}

{{ ['tom','bob','ada'] | upper }}

字典列表操作

{% set users=[{'name':'Tom','gender':'M','age':20},

{'name':'John','gender':'M','age':18},

{'name':'Mary','gender':'F','age':24},

{'name':'Bob','gender':'M','age':31},

{'name':'Lisa','gender':'F','age':19}]

%}

{# 按指定字段排序,这里设reverse为true使其按降序排 #}

    {%foruserinusers | sort(attribute='age', reverse=true) %}

  • {{ user.name }}, {{ user.age }}
  • {% endfor %}

    {# 列表分组,每组是一个子列表,组名就是分组项的值 #}

      {%forgroupinusers|groupby('gender') %}

    • {{ group.grouper }}
      • {%foruseringroup.list %}

      • {{ user.name }}
      • {% endfor %}

        {% endfor %}

        {# 取字典中的某一项组成列表,再将其连接起来 #}

        {{ users | map(attribute='name') | join(', ') }}

        介绍了这么多的过滤器我们用实例来看看如何使用

        为了让页面更加好看,我们去Bootstrap上面扒一个页面

        然后按照我们的需求改一下页面内容如下:

        大概就这样了 

        而负责展示的HTML两个参数设置是这样的

        我们在python函数中是这样定义这两个参数的

        现在我们就来测试一下Flask其中一个过滤器

        # 如果当前变量没有值,则会使用参数中的值来代替。

        default(value,default_value,boolean=False):

        这个过滤器是什么意思呢?

        简单点来说就是有值显示值,没值显示default(就是你设置的默认值)

        我们就来测试一下name

        现在的值是demacia(德玛西亚)

        我们现在将它设置为空

        如果不出意料的话,他会打印出

        '此地很懒,自己叫什么都不知道!'

        再来看一组例子

        我们把message信息换成一个无序的列表

        [88, 99, 77, 22, 44, 66, 56, 13, 72, 27]

        然后我们使用sort来对其进行排序

        length求长度

        这里只是列出了比较常用的过滤器,更多的过滤器可以查看官方文档http://jinja.pocoo.org/docs/2.10/templates/#list-of-builtin-filters

        自定义过滤器

        内置过滤器并不是都能满足人人需求,所有Jinja2还支持自定义过滤器.

        一般创建自定义过滤器有两种方式

        第一种是通过Flask应用对象的add_template_filter()方法

        Flask应用对象add_template_filter()方法定义过滤器主要用于统计文字长度.

        我们先创建一个run.py文件定义一个count_length()的函数,用于统计问名字长度

        fromflaskimportFlask, render_template

        # 求长度的函数

        defcount_length(parm):

        returnlen(parm)

        # 实例化Flask对象

        app = Flask(__name__)

        # 添加函数

        app.add_template_filter(count_length,'count_length')

        @app.route('/')

        defindex():

        content ='''

        德玛西亚是一个法理至上的强大王国,战功赫赫,久负盛名。德玛西亚人自古崇尚正义、荣耀和责任,近乎狂热地以自身的传统及底蕴为豪。然而,尽管秉持着这些高尚的原则,在过去的几百年间,刚愎自用的德玛西亚越发与世隔绝,成为了孤立主义的代名词。

        然而现在,王国中已经出现了变数。

        德玛西亚雄都以禁魔石——一种可以抑制魔法能量的白色岩石——为基,起初是符文战争之后为了躲避魔法侵害的人们所建立的庇护地。王权由中心向外辐射,守护着边远的城镇、农田、森林和矿产丰饶的山脉。

        然而,自从嘉文三世国王突然驾崩,各大家族至今仍未赞同他唯一的继承人嘉文王子继位。

        在王国眼中,重兵把守的边境之外已经是异心遍起,许多原先的附庸在乱世来临之际开始寻求来自别处的庇护。有人私下妄言,德玛西亚的黄金时代已经一去不返,除非臣民能够上下一心,顺应时代的变化——许多人认为他们并没有这样的能力,否则王国的衰败在所难免。

        再多的禁魔石,也无法阻止德玛西亚由内而外的覆灭

        '''

        returnrender_template('index.html', content =content)

        if__name__ =='__main__':

        app.run(

        debug=True,

        port=8000

        )

        然后将count_length()函数添加到add_template_filter()方法中作为过滤器使用.

        全文共计{{ content|count_length }}字

        {{ content }}

        接下我们去访问 http://127.0.0.1:8000/

        第二种是通过app.template_filter()装饰器来实现自定义过滤器

        创建run.py文件,在该文件中定义count_length()函数,用于统计文章字数

        然后使用@app.template_filter装饰器修饰count_length()函数.

        fromflaskimportFlask, render_template

        # 实例化Flask对象

        app = Flask(__name__)

        # 求长度的函数

        @app.template_filter()

        defcount_length(parm):

        returnlen(parm)

        @app.route('/')

        defindex():

        content ='''

        诺克萨斯是一个威名震天的强大帝国。在诺克萨斯境外的人眼中,它拥兵自重、血腥野蛮、欲壑难填,但对于那些看透它好战外表的人来说,这里的社会氛围实际上超乎寻常地包容。人民的所有特长和天赋都会得到尊重和受到培养的机会。

        古代诺克西人是残暴的野蛮人部落联合,他们占领了一座古城,并将其建成了现在的帝国中心。当时的诺克萨斯面临着来自各方的威胁,所以他们与所有敌人都激烈交锋,睚眦必报,不胜不归,最终让帝国的版图连年扩张。这一段艰难求生的历史让诺克萨斯人从骨子里感到骄傲自豪,也因此重视力量胜过一切。当然,力量可以通过许多不同的形式表现。

        无论社会立场、身世背景、祖国故乡和个人财富如何,任何人都可能在诺克萨斯获得权力、地位、和尊敬,只要他们能够表现出必要的能力。能够使用魔法的人会被高看一眼,帝国甚至会主动寻觅这类人,让他们的特殊天赋得到锻炼并最高效地为帝国所用。

        虽然诺克萨斯有贤能统治的政治理想,但老一辈贵族家庭依然在帝国的心脏把持着相当大的权力,有人担心诺克萨斯最大的威胁并非来自敌人,而是来自内部

        '''

        returnrender_template('index.html', content =content)

        if__name__ =='__main__':

        app.run(

        debug=True,

        port=8000

        )

        效果与上面是一样的

        控制效果

        Jinja2中也提供了许多的控制结构,作用是为了改变模板的渲染流程。

        {%        %}是Jinja2中的控制语句,

        {{     }}是Jinja2中的变量,

        {#       #}是注释。

        那么模板中是如何使用条件控制语句呢?

        条件控制结构

        根据值,选择不同的语句执行 ,从而获得不同的响应字符串。

        {%ifname %}

        Hello {{ name }}, can you hear me !

        {%else%}

        Hello World!

        {% endif %}

        循环控制语句

        {%foriteminitems %}

        {{ item }}

        {% endfor %}

        run.py文件

        fromflaskimportFlask, render_template

        # 实例化Flask对象

        app = Flask(__name__)

        @app.route('/')

        defcontrol():

        name ='大魔王'

        my_list = list(range(1,10))

        returnrender_template('index1.html', items = my_list)

        if__name__ =='__main__':

        app.run(

        debug=True,

        port=8000

        )

        好了,关于Flask模板我们专门拉出一节单讲是因为它足够重要,

        下一节我们一起来看看Flask中的模板

        相关文章

        网友评论

            本文标题:Flask过滤器

            本文链接:https://www.haomeiwen.com/subject/wokdbltx.html