Flask模板Jinja2引擎介绍

一、Jinja2变量及函数

1、标准变量及函数

在Flask的Jinja2模板中自动引入了一些标准变量,如request,session,g,config,标准函数有url_for,get_flashed_messages。

get_flashed_messages函数会获取我们在view_func中定义的flash消息。

{% meassages=get_flashed_messages %} {{messages}}

config对象的使用就是如在Python普通类的用法:{{config.DEBUG}}

2、自定义变量

1)自定义变量

from flask import current_app

@app.context_processor def appinfo(): return dict(appname=current_app.name)

在模板中引用:{{appname}} 上面主要利用的是app装饰器,context_processor,被装饰的函数会添加到app属性emplate_context_processors中,而且构建变量上下文必须返回的是一个字典,具体源代码如下:


@setupmethod
    def context_processor(self, f):
        """Registers a template context processor function."""
        self.template_context_processors[None].append(f)
        return f

2)自定义函数:


import time

@app.context_processor
def get_current_time():
    def get_time(timeFormat="%b %d, %Y - %H:%M:%S"):
        return time.strftime(timeFormat)
    return dict(current_time=get_time)

在模板中引用 {{current_time()}}

另外一种方法是通过装饰器,app.template_global:


import time
@app.template_global('end_with')
def current_time(timeFormat="%b %d, %Y - %H:%M:%S"):
    return time.strftime(timeFormat)

等同于Flask中: app.jinja_env.globals['current_time'] = current_time

二、语句和表达式

1、表达式

模板的表达式都是包含在{{ }}中,表达式的用法和Python的语法比较相似:

  • 表达式里可使用变量,或者Python基础类型,如字符串,整数,浮点数,列表,元祖,字典等等;
  • 可以进行运算,如加减乘除,逻辑运算,比较运算 {{ 2==2 }}
  • 函数调用 {{ url_for(...) }}
  • in 操作 {{ "it in ['d','y','it'] }}
  • 字符串连接符 ,类似于Python的 + 字符串连接符 {{ "hello" ~ "haibo" }}
  • 过滤器以及测试器 {{ "HI %s " %name if name }}

2、控制语句

控制语句主要有 if条件控制语句和for循环控制语句两种,定义在{% %}分隔符中。


{% if name and name in ['s','s'] %}
     pass
{% else %}
    pass
{%endif%}

{% for item in list %}
    pass
{%endfor %}

3、其他重要语句

1) 赋值语句:{% set name = [1,2,4] %}
2) with语句,类似于Python的with。


{% with foo = 1 %}
    {% set bar = 2 %}
    {{ foo + bar }}
{% endwith %}

3)如果想将表达式如语句一样操作,可以加上do


{% with arr = ['Sunny'] %}
  {% do arr.append('Rainy') %}
  {{ arr }}
{% endwith %}

三、过滤器及测试器

1、过滤器

对变量进行过滤的操作很简单,只需要在变量后加上 “|”符号即可 ,如果 {{ name | upper }}即将变量name变成大写。
多个过滤器可以共同使用,即使用多个 | 符号。

在Flask中内置的过滤器主要有tojson,即将变量变为json字符串。
{{ users |tojson|safe }}

Jinja2内置了很多的过滤器:

(1)数值过滤器

1、四舍五入 {{ 12.88 | round }};
2、绝对值 {{ -12 | abs }};
3、向下截取小数点固定位数 {{ 12.888 | round(3,'floor') }};

(2)列表过滤器

  • 取列表第一个元素 {{ [1,2,5,2] | first }};
  • 取列表最后一个元素 {{ [1,2,5,2] | last }};
  • 返回列表长度 {{ [1,2,5,2] | length }};
  • 列表求和 {{ [1,2,5,2] | sum }};
  • 列表排序,默认是升序 {{ [1,2,5,2] | sort }};
  • 合并为字符串,犹如Python的join {{ [1,2,5,2] | join(',') }};
  • 列表中元素变为大小写,{{ ['s','df','sf'] | upper }};

(3)字典过滤器

  • 按指定字段排序
    users是一个字典 {% for user in users | sort(attribute='height', reverse=true) %}

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

  • 将字典中的某一个关键字的元素连接起来 {{ users | map(attribute='name') | join(', ') }}

(4)字符串过滤器

  • 单词全大写或全小写 {{ name | lower }};
  • 单词首个字母大写 {{ name |capitalize }};
  • 去除字符串前后的空白 {{ " haibo " | trim }};
  • 字符串反转 {{ name | reverse }};
  • 格式化输出,与Python类似 {{ "%s" | format(name) }};
  • 关闭HTML自动转义 {{ name | safe }};

关于更多的内置过滤器,可参考 Jinja2官网内置过滤器

我们也可以自定义过滤器,类似于自定义函数一样,只要使用template_filter装饰器。


@app.template_filter('sub')
def sub(l, start, end):
    return l[start:end]

2、测试器

就是if控制语句加上 is,如{% if name is upper %}

内置测试器:


检查变量是否被定义,也可以用undefined检查是否未被定义 
{% if name is defined %}
    

Name is: {{ name }}

{% endif %} 检查是否所有字符都是大写 {% if name is upper %} {% endif %} 检查变量是否为空 {% if name is none %} {% endif %} 检查变量是否为字符串,也可以用number检查是否为数值 {% if name is string %} {% endif %} 检查数值是否是偶数,也可以用odd检查是否为奇数 {% if 2 is even %} {% endif %} 检查变量是否可被迭代循环,也可以用sequence检查是否是序列 {% if [1,2,3] is iterable %} {% endif %} 检查变量是否是字典 {% if {'name':'test'} is mapping %} {% endif %}
--------EOF---------
微信分享/微信扫码阅读