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 '
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 '
#demo.html
# 输出哪些数据
{# 变量语法 #}
{ { info }}
{# { { my_list }}#}
{% for index in my_list %}
{% if index > 4 %}
{#
index
#}{ { index }}
# 注意: 变量用的是双括号,语句用的是单括号.
模块化:把具体的功能模块拆分出去,达到解耦合.
三.过滤器
过滤器的本质就是函数。有时候我们不仅仅只是需要输出变量的值,我们还需要修改变量的显示,甚至格式化、运算等等,而在模板中是不能直接调用 Python 中的某些方法,那么这就用到了过滤器。
用途:格式化输出数据,用在模板中.
本质:函数
语法:{ {variable | filter_name(*args)}} # 控制变量值格式化输出,所以用双括号.如果没有任何参数传给过滤器,则可以把括号省略掉. # 控制变量值格式化输出,所以用双括号.
# 过滤器支持链式调用,即多个过滤器从前到后依次调用.{ {variable | filter_name1(*args) | filter_name2(*args} | ...}
1.过滤器的使用
<1>字符串处理
safe: 禁用转义,确认数据没有安全隐患的前提下(模板默认情况下开启转义,即将字符串中的<>&' ” 特殊字符,当成原始字符串进行输出.开启转义是处于安全考虑)
capitalize:首字母大写,其余字母小写;
lower:转小写
upper:转大写
title:把值中的每个单词的首字母都转成大写
format:格式化输出
{ { '%s is %d' | format('name',17) }}
{ { 'hello' | striptags }}
需求:添加列表反转的过滤器
方式一
通过调用应用程序实例的 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 中使用该自定义过滤器
my_array 原内容:{ { my_array }}
my_array 反转:{ { my_array | lireverse }}
运行结果
my_array 原内容:[3, 4, 2, 1, 7, 9]
my_array 反转:[9, 7, 1, 2, 4, 3]