Flask中模板及其使用(一)

                                                                  Flask中模板及其使用
    所谓模板,其实就是一个包含响应文本的文件,其中用占位符(变量)表示动态部分,告诉模板引擎其具体的值需要从使用的数据中获取.在Flask中,模板使用的就是Jinja2引擎.
# 模板并不特指HTML文件,HTML文件只是模板的一种.

视图的作用:(未使用模板时)
    在前面面的示例中,视图函数的主要作用是生成请求的响应,这是最简单的请求。实际上,视图函数有两个作用:处理业务逻辑和返回响应内容。在大型应用中,把业务逻辑和表现内容放在一起,会增加代码的复杂度和维护成本。本节学到的模板,它的作用即是承担视图函数的另一个作用,即返回响应内容。

模板作用
返回响应内容,此时不再由视图返回.
<1>模板其实是一个包含响应文本的文件,其中用占位符(变量)表示动态部分,告诉模板引擎其具体的值需要从使用的数据中获取
<2>使用真实值替换变量,再(控制)返回最终得到的字符串,这个过程称为“渲染”。
<3>Flask是使用 Jinja2 这个模板引擎来渲染模板

Jinja2
<1>.Jinja2:
    是 Python 下一个被广泛应用的模板引擎,是由Python实现的模板语言,他的设计思想来源于 Django 的模板引擎,并扩展了其语法和一系列强大的功能,是Flask内置的模板语言。
<2>.模板语言:
    是一种被设计来自动生成文档的简单文本格式,在模板语言中,一般都会把一些变量传给模板,替换模板的特定位置上预先定义好的占位变量名。

渲染模板函数
<1>Flask提供的 render_template 函数封装了该模板引擎
<2>render_template 函数的第一个参数是模板的文件名,后面的参数都是键值对,表示模板中变量对应的真实值。

一.模板的使用
# 通过函数调用
# 语法:render_template('选择的模板名', '模板中传入变量=变量')  此函数封装了模板引擎Jinja2

from flask import Flask
from flask_script import Manager
from flask import render_template
--------部分代码省略
@app.route('/')
def index():
    # return '<h1>hello world</h1>'  # 浏览器可以渲染超文本标记语言
    return render_template('demo8.html')  # 模板中数据固定

if __name__ == '__main__':
    # 代替app 调用run方法
    manager.run()

# def render_template(template_name_or_list, **context):
    """Renders a template from the template folder with the given
    context.

    :param template_name_or_list: the name of the template to be
                                  rendered, or an iterable with template names
                                  the first one existing will be rendered
    :param context: the variables that should be available in the
                    context of the template.
    """

二.动态传入数据给模板
1.变量  # 用在模板中
存储数据,被动过程.将传入模板的数据全部输出.
语法:{{变量名}}  # 模板中使用,和Djnago中模板变量相同
@app.route('/')
def index():
    info = 'oo'
    return render_template('demo1.html', info=info) # 将变量info写入模板文件中

2.语句  # 用在模板中
作用:控制输出,主动过程.在模板中,对传入的数据进行选择性输出.
<1>条件语句/判断语句
语法:{% if 表达式 %}{% elif 表达式 %}{% endif %}

<2>.循环语句
语法:{% for %}{% endfor %},必须有结束语句,用来结束代码.
快捷键:Table
# .py   
# 使用哪个模板,传递哪些数据给选中模板
@app.route('/')
def index():
    # return '<h1>hello world</h1>'  # 浏览器可以渲染超文本标记语言
    # return render_template('demo8.html')  #
    info = 'oo'
    # return render_template('demo8.html', info=info)
    my_list = [1, 4, 7, 21]
    return render_template('demo.html', my_list=my_list)

#demo.html
# 输出哪些数据
{# 变量语法 #}
{{ info }}
{# {{ my_list }}#}
{% for index in my_list %}
    {% if index > 4 %}
{#        <p>index</p>#}
        <p>{{ index }}</p>
    {% endif %}
{% endfor %}  # 结束代码块,python中用缩进来结束


# 注意: 变量用的是双括号,语句用的是单括号.
模块化:把具体的功能模块拆分出去,达到解耦合.

三.过滤器
       
过滤器的本质就是函数。有时候我们不仅仅只是需要输出变量的值,我们还需要修改变量的显示,甚至格式化、运算等等,而在模板中是不能直接调用 Python 中的某些方法,那么这就用到了过滤器
用途:格式化输出数据,用在模板中.
本质:函数
语法:{{variable | filter_name(*args)}}   #  控制变量值格式化输出,所以用双括号.如果没有任何参数传给过滤器,则可以把括号省略掉.   # 控制变量值格式化输出,所以用双括号.
# 过滤器支持链式调用,即多个过滤器从前到后依次调用.{{variable | filter_name1(*args) | filter_name2(*args} | ...}  
1.过滤器的使用
<1>字符串处理
safe: 禁用转义,确认数据没有安全隐患的前提下(模板默认情况下开启转义,即将字符串中的<>&' ” 特殊字符,当成原始字符串进行输出.开启转义是处于安全考虑)
capitalize:首字母大写,其余字母小写;
lower:转小写
upper:转大写
title:把值中的每个单词的首字母都转成大写
format:格式化输出   <p>{{ '%s is %d' | format('name',17) }}</p>
striptags:渲染之前把值中所有的HTML标签都删掉
                 <p>{{ '<em>hello</em>' | striptags }}</p>
reverse: 字符串反转
2.列表处理
first:获取列表中第一个元素.
last: 获取列表中最后一个元素.
length: 获取列表中元素数量.
sum: 对列表中数据进行求和.
sort: 对列表进行排序.
3.语句块操作
{% filter upper %}
    #一大堆文字#
{% endfilter %}
4.自定义过滤器
       过滤器的本质是函数。当模板内置的过滤器不能满足需求,可以自定义过滤器。自定义过滤器有两种实现方式:
       一种是通过Flask应用对象的 add_template_filter 方法
       另一种是通过装饰器来实现自定义过滤器。
重要:自定义的过滤器名称如果和内置的过滤器重名,会覆盖内置的过滤器。

需求:添加列表反转的过滤器

方式一

通过调用应用程序实例的 add_template_filter 方法实现自定义过滤器。该方法第一个参数是函数名,第二个参数是自定义的过滤器名称:
# 自定义的过滤器
def do_listreverse(li):
    # 通过原列表创建一个新列表
    temp_li = list(li)
    # 将新列表进行返转
    temp_li.reverse()
    return temp_li

app.add_template_filter(do_listreverse,'lireverse')
方式二

用装饰器来实现自定义过滤器。装饰器传入的参数是自定义的过滤器名称。
# 自定义的过滤器
@app.template_filter('lireverse')
def do_listreverse(li):
    # 通过原列表创建一个新列表
    temp_li = list(li)
    # 将新列表进行返转
    temp_li.reverse()
    return temp_li
在 html 中使用该自定义过滤器
<br/> my_array 原内容:{{ my_array }}
<br/> my_array 反转:{{ my_array | lireverse }}
运行结果
my_array 原内容:[3, 4, 2, 1, 7, 9] 
my_array 反转:[9, 7, 1, 2, 4, 3]
 

©️2020 CSDN 皮肤主题: 书香水墨 设计师:CSDN官方博客 返回首页