Flask模板知识介绍

一、jinja2过滤器

  • 1.内置过滤器
    变量可以通过 过滤器 修改。过滤器与变量用管道符号( | )分割,并且也 可以用圆括号传递可选参数。多个过滤器可以链式调用,前一个过滤器的输出会被作为 后一个过滤器的输入。使用方法:{{ 变量名|过滤器名("参数") }}
过滤器 说明
abs 返回一个数值的绝对值
default 当前变量没有值则返回默认值,boolean=True当变量有值但是值为False(空字符串,空列表,空字典)时返回默认值
safe 可以关闭一个字符串的自动转义, 禁用转义
escape 对某一个字符串进行转义
first 返回一个序列的第一个元素
last 返回最后一个值
format 格式化字符串
length 返回一个序列类型的长度
join 将一个序列,用指定的参数拼接成字符串
int 将值转换为 int 类型
float 将值转换为 float 类型
lower 将字符串转换为小写
upper 将字符串转换为大写
string 将变量转换为字符串
replace 替换字符串replace('原字符串', '新字符串')
truncate 截取指定长度的字符串truncate(length=8)
striptags 删除字符串中所有的HTML标签,如果出现多个空格,将替换成一个空格
trle 截取字符串前面和后面的空白字符
wordcount 计算一个长字符串中单词的个数
title 把值中的第个单词的首页字母变成大写
captalize 把变量值的首字母转成大写,其余字母转小写
trim 把值的首尾空格去掉
reverse 字符串的反转
sum 列表求和
sort 列表排序
  • 2.自定义过滤器
    过滤器的本质就是函数,如果在模板中调用这个过滤器,那么就会将这个变量的值作为第一个参数传给过滤器函数,然后将函数的返回值作为滤器的返回值, 在python文件中写好过滤的函数和逻辑,将函数注册到模板过滤器中:@app.template_filter('过滤器名'),在模板中调用过滤器:变量|过滤器名。
@app.template_filter('my_filter')
def add_unit(data, unit)
    data = str(data)+unit
    return data    

在模板中使用:

<p>{{ data|my_filter('%') }}</p>
<p>{{ age|my_filter('岁')}}</p>

二、控制语句

所有的控制语句都是放在{% ... %}中,并且有⼀个语句{% endxxx %}来进⾏结束,Jinja中常⽤的控制语句有if/for..in..

  • 1.if控制语句
    新建一个app.py实例文件,代码如下:
from flask import Flask, render_template, request, redirect, url_for
app = Flask(__name__)
@app.route('/if/')
def if_control():
    contest = {
        'name': 'zhangsan',
        'age': 20
    }
    return render_template('if.html', **contest)
if __name__ == '__main__':
    app.run(debug=True)

新建一个if.html文件,代码如下:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>if控制语句</title>
</head>
<body>
    {% if name %}  // 判断name变量是否为真,注意这里变量无需通过{{ 变量名 }}的方式来表示
        <p><b>您好,{{ name }}!</b></p>
    {% endif %}
    {% if age >= 18 %}  // 判断age变量是否大于18
        <p><b>成年人</b></p>
     {% else %}
        <p><b>未成年人</b></p>
    {% endif %}
</body>
</html>
  • 2.for控制语句的装载
    新建一个app.py实例文件,代码如下:
from flask import Flask, render_template, request, redirect, url_for
app = Flask(__name__)
@app.route('/for/')
def for_control():
    contest = {
        'books': [
            {
                'name': '三国演义',
                'author': '罗贯中',
                'price': 70
            },
            {
                'name': '西游记',
                'author': '吴承恩',
                'price': 70
            },
            {
                'name': '红楼梦',
                'author': '曹雪芹',
                'price': 70
            },
            {
                'name': '水浒传',
                'author': '施耐庵',
                'price': 70
            }
        ]
    }
    return render_template('for.html', **contest)
if __name__ == '__main__':
    app.run(debug=True)

新建一个for.html文件,代码如下:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>for控制语句</title>
</head>
<body>
<table>
    <tr>
        <th>书名</th>
        <th>作者</th>
        <th>价格</th>
    </tr>
    {% for book in books %}
    <tr>
        {% for value in book.values() %}
            <td>{{ value }}</td>
        {% endfor %}
    </tr>
    {% endfor %}
</table>
</body>
</html>

并且Jinja2中的for循环还包含以下变量,可以⽤来获取当前的遍历状态。

变量 描述
loop.index 当前迭代的索引(从1开始)
loop.index0 当前迭代的索引(从0开始)
loop.first 是否是第⼀次迭代,返回True或False
loop.last 是否是最后⼀次迭代,返回True或False
loop.length 序列的⻓度

另外,不可以使⽤continue和break表达式来控制循环的执⾏。

三、宏和import

  • 宏的简介
    宏类似常规编程语言中的函数。它们用于把常用行为作为可重用的函数,取代 手动重复的工作。如果宏在不同的模板中定义,你需要首先使用 import,比如:
{% macro input(name, value='', type='text', size=20) -%}
    <input type="{{ type }}" name="{{ name }}" value="{{
        value|e }}" size="{{ size }}">
{%- endmacro %}

在命名空间中,宏之后可以像函数一样调用:

<p>{{ input('username') }}</p>
<p>{{ input('password', type='password') }}</p>
  • 宏的导入import
    定义一个宏文件macros.html。
<!--宏模板文件-->
<!--macros.html-->
{% macro input(name="",value="", type="text") %}
    <!--value加变量参数-->
    <input type="{{type}}" name="{{ name }}" value="{{ value }}">
{% endmacro %}

导入方式有如下几种:

{% import "macros.html" as macros %}
{% from "macros.html" import input %}
{% from "macros.html" import input as macros %}

另外需要注意的是,导⼊模板并不会把当前上下⽂中的变量添加到被导⼊的模板中,如果你想要导⼊⼀个需要访问当前上下⽂变量的宏,有两种可能的⽅法显式地传⼊请求或请求对象的属性作为宏的参数与上下⽂⼀起(with context)导⼊宏。

{% import "macros.html" as macros with context %}
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,245评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,749评论 3 391
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,960评论 0 350
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,575评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,668评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,670评论 1 294
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,664评论 3 415
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,422评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,864评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,178评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,340评论 1 344
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,015评论 5 340
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,646评论 3 323
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,265评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,494评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,261评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,206评论 2 352