flask jinja2 mysql_Flask 学习(二)jinja2模板介绍

本文详细介绍了如何在Flask中使用Jinja2模板,包括变量、表达式、控制语句、过滤器、测试器、自定义过滤器和测试器、全局函数以及模板继承等。通过示例代码展示了如何处理字符串、数值、列表、字典等数据类型,并提供了实际的模板应用实例。
摘要由CSDN通过智能技术生成

控制语句和表达式

举例

Flask Python代码

from flask importFlask, render_template, redirect, request

app= Flask(__name__)

STUDENT= {'name': 'Old', 'age': 38, 'gender': '中'}

STUDENT_LIST=[

{'name': 'Old', 'age': 38, 'gender': '中'},

{'name': 'Boy', 'age': 73, 'gender': '男'},

{'name': 'EDU', 'age': 84, 'gender': '女'}

]

STUDENT_DICT={'a': {'name': 'Old', 'age': 38, 'gender': '中'},'b': {'name': 'Boy', 'age': 73, 'gender': '男'},'c': {'name': 'EDU', 'age': 84, 'gender': '女'},

}

@app.route("/detail")defdetail():print(url_for("detail"))return render_template("detail.html", **STUDENT)

@app.route("/detail_list", )defdetail_list():return render_template("detail_list.html", stu_list=STUDENT_LIST)

@app.route("/detail_dict")defdetail_dict():return render_template("detail_dict.html", stu_dict=STUDENT_DICT)

detail.html

Title
nameagegender
{{ name }}{{ age }}{{ gender }}

detail_list.html

Title
nameagegender

{% if stu.name != "Old" %}

{% if stu.age != 73 %}

{{ stu.name }}{{ stu.get("age") }}{{ stu["gender"] }}{% endif %}

{% endif %}

{% endfor %}

detail_dict.html

Title
idnameagegender
{{ stu_key }}{{ stu_value.get("name") }}{{ stu_value.age }}{{ stu_value.gender }}

表达式

1.最常用的是变量,由Flask渲染模板时传过来,比如name

也可以是任意一种Python基础类型,比如字符串{{stu_list}},用引号括起;或者数值,列表,元祖,字典,布尔值。直接显示基础类型没啥意义,一般配合其他表达式一起用2.运算。包括算数运算,如{{ 2 + 3 }};比较运算,如{{ 2 > 1 }};逻辑运算,如{{ False andTrue }}

3.过滤器|和测试器is4.函数调用,如{{ current_time() }};数组下标操作,如{{ arr[1] }}

in操作符,如{{1 in [1,2,3] }}5.字符串连接符~,作用同Python中的+一样,如{{ "Hello" ~ name ~ "!" }}

6.None值处理{{name or ""}

控制语句

Jinja2的控制语句主要就是条件控制语句if,和循环控制语句for,语法类似于Pythonif-else:

{% if name and name == 'admin' %}

This is admin console

{% elif name %}

Welcome {{ name }}!

{% else %}

Please login

{% endif %}for:

{% for stu in stu_list%}

{{ stu }}

{% endfor %}

过滤器

字符串

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

{#单词首字母大写 #}

{{ 'hello world' | capitalize }}

{#单词全小写 #}

{{ 'XML' | lower }}

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

{{ 'hello' | trim }}

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

{{ 'hello' | reverse }}

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

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

{#关闭HTML自动转义 #}

{{ 'name' | safe }}

{% autoescape false %}

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

{{ 'name' | escape }}

{% endautoescape %}

数值操作

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

{{ 12.98 | round }}

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

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

{#绝对值,返回12 #}

{{ -12 | abs }}

列表操作

#取第一个元素 #}

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

{#取最后一个元素 #}

{{ [1,2,3] | 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无效 #}

{{ ['alex','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使其按降序排 #}

  • {% for user in users | sort(attribute='age', reverse=true) %}
  • {{ user.name }}, {{ user.age }}{% endfor %}
{#列表分组,每组是一个子列表,组名就是分组项的值 #}
  • {% for group in users|groupby('gender') %}
  • {{ group.grouper }}
    • {% for user in group.list %}
    • {{ user.name }}{% endfor %}
    {% endfor %}
{#取字典中的某一项组成列表,再将其连接起来 #}

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

3fbfc84e909b1a204b554f6b82b42d25.png

自定义过滤器

#第一种方式

defget_even_list(l):return l[::2]#函数的第一个参数是过滤器函数,第二个参数是过滤器名称

app.add_template_filter(get_even_list, 'even_filter')#第二种方式

@app.template_filter() #过滤器函数

defis_even(num):if num % 2 ==0:return "even number"

else:return "odd number"

使用

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

{{ 2 | is_even }}

测试器

测试器总是返回一个布尔值,它可以用来测试一个变量或者表达式,使用”is”关键字来进行测试。

{% set name='ab' %}

{% if name is lower %}

"{{ name }}" are all lower case.

{% endif %}

测试器本质上也是一个函数,它的第一个参数就是待测试的变量,在模板中使用时可以省略去。如果它有第二个参数,

模板中就必须传进去。测试器函数返回的必须是一个布尔值,这样才可以用来给if语句作判断。

内置测试器

举例

{#检查变量是否被定义,也可以用undefined检查是否未被定义 #}

{% if name is defined %}

Name is: {{ name }}

{% endif %}

{#检查是否所有字符都是大写 #}

{% if name is upper %}

"{{ name }}" are all upper case.

{% endif %}

{#检查变量是否为空 #}

{% if name is none %}

Variable is none.

{% endif %}

{#检查变量是否为字符串,也可以用number检查是否为数值 #}

{% if name is string %}

{{ name }} is a string.

{% endif %}

{#检查数值是否是偶数,也可以用odd检查是否为奇数 #}

{% if 2 is even %}

Variable is an even number.

{% endif %}

{#检查变量是否可被迭代循环,也可以用sequence检查是否是序列 #}

{% if [1,2,3] is iterable %}

Variable is iterable.

{% endif %}

{#检查变量是否是字典 #}

{% if {'name':'test'} is mapping %}

Variable is dict.

{% endif %}

官方文档

自定义测试器

定义

#自定义测试器#第一种方式

importredeftest_tel(tel_num):

tel_re= r'\d{11}'

returnre.match(tel_re,tel_num)

app.add_template_test(test_tel,"is_tel")#第二种方式

@app.template_test('start_with')defstart_with(str, suffix):return str.lower().startswith(suffix.lower())

使用

{% set tel = '18910171111' %}

{% if tel is is_tel %}

{{ tel }} is mobile phone

{% endif %}

{% set name = 'Hello world' %}

{% if name is start_with 'hello' %}

"{{ name }}" start_with "hello"

{% endif %}

全局函数

内置全局函数

{#全局函数range()的作用同Python里的一样,返回指定范围内的数值序列。三个参数分别是开始值,结束值(不包含),间隔。

如果只传两个参数,那间隔默认为1;如果只传1个参数,那开始值默认为0。 #}

  • {% for num in range(10,20,2) %}
  • Number is "{{ num }}"{% endfor %}
{#dict()函数,方便生成字典型变量 #}

{% set user = dict(name='Joh',age=22) %}

{{ user | tojson | safe }}

{#显示 '{"age": 22, "name": "Joh"}' #}

{#joiner()函数,它可以初始化为一个分隔符,然后第一次调用时返回空字符串,以后再调用则返回分隔符 #}

{% set sep = joiner("|") %}

{% for val in range(5) %}

{{ sep() }}{{ val }}{% endfor %}

{#显示 "0 | 1 | 2 | 3 | 4" #}

{#cycler()函数,在给定的序列中轮循 #}

{% set cycle = cycler('odd', 'even') %}

  • {% for num in range(10, 20, 2) %}
  • Number is "{{ num }}",

    next lineis "{{ cycle.current }}" line.

    {% endfor %}

{#next(),返回当前值,并往下一个值轮循

reset(),重置为第一个值

current,当前轮循到的值#}

官方文档

自定义全局函数

定义

#自定义全局函数#第一种方式

@app.template_global()def add_sum(*args):returnsum(args)#第二种方式

importtimedef current_time(timeFormat="%b %d, %Y - %H:%M:%S"):returntime.strftime(timeFormat)

app.add_template_global(current_time,'current_time')

使用

{{ add_sum(1,2,3,4,5) }}

Current Time is: {{ current_time() }}

Current Day is: {{ current_time("%Y-%m-%d") }}

块 (Block)

一般我们的网站虽然页面多,但是很多部分是重用的,比如页首,页脚,导航栏之类的。对于每个页面,都要写这些代码,很麻烦。

Flask的Jinja2模板支持模板继承功能,省去了这些重复代码。

template:

{% block template1 %}

{% endblock %}

你好,template2

{% block template2 %}

{% endblock %}

你好,template

{% block template %}

{% endblock %}

extend:

{% extends "he.html" %}

{% block template %}

yuan

{% endblock %}

{% block template1 %}

alex

{% endblock %}

{% block template2 %}

wu

{% include "aaa.html" %}

{% endblock %}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值