六、模板
模板文件就是按照特定的规则属性的负责展示效果的HTML文件;模板引擎就是提供特定转换和解析的工具。
6.1.模板渲染
from flask import Blueprint, render_template
在templates目录下创建一个模板文件index.html
在views中渲染模板 render_tempate('index.html')
<--index.html/-->
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>首页</title>
</head>
<body>
<h1>武汉加油</h1>
<p>{
{ name }}</p>
</body>
</html>
# views.py
from flask import Blueprint, render_template
bp = Blueprint('bp',__name__,url_prefix='/bp')
@bp.route('/')
def hello_world():
#return 'Hello World!'
#1.固定值传参
return render_template('index.html',name='钟南山')
render_template用法:
# 第一个参数模板文件名,
# 后面可以任意多个关键字参数,一个参数对应模板中一个变量
eg:
# 2.传递所有的局部变量到模板,locals()是一个字典,包含了所有的局部变量
name = '国士无双'
return render_template('index.html',**locals())
# 3.关键字参数传递
# return render_template('index.html',name='米老鼠')
# 4.传字典
return render_template('index.html',**{
'name':'唐老师'})
6.2.变量
变量在模板中的表示为: { { 变量名 }},变量名就是render_template中提供的参数。
变量的基本类型:
数值、字符串、布尔,也可以是字典、对象、列表等。
jinja2提供了点号或[]来访问复杂数据结构
注意:
变量就是视图函数传递给模板的数据
变量要遵循标识符的命名规则
如果模板中的变量不存在则插入空字符串
# views.py
from flask import Blueprint, render_template
from user import User
bp = Blueprint('bp',__name__,url_prefix='/bp')
@bp.route('/var/')
def render_vars():
age = 20
list1 = [20,98,76]
dict1 = {
'name':'tom','age':30}
user = User('中国',71)
return render_template('vars.html',**locals())
<--vars.html/-->
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>变量</title>
</head>
<body>
<p>{
{ age }}</p>
<p>列表</p>
<p>{
{ list1.0 }}---{
{ list1[1] }}</p>
<p>字典</p>
<p>
{
{ dict1['name']}} --- {
{ dict1.name }}
</p>
<p>自定义对象</p>
<p>{
{ user.name }}--{
{ user.age }}</p>
</body>
</html>
#user.py
class User:
def __init__(self,name,age):
self.name = name
self.age = age
6.3过滤器
过滤器:变量可以通过 过滤器 修改。
过滤器与变量⽤管道符号( | )分割,并且也 可以⽤圆括号传递可选参数。
多个过滤器可以链式调⽤,前⼀个过滤器的输出会被作为 后⼀个过滤器的输⼊
使⽤: {
{
name | upper }} ,转换为全⼤写输出
常⽤过滤器:
过滤器 | 说明 |
---|---|
upper | 全大写 |
lower | 全小写 |
title | 每个单词首字母大写 |
capitalize | 首字母大写 |
trim | 去掉两边的空白 |
striptags | 过滤掉HTML标签 |
safe | 渲染是不转义 |
#views.py
@bp.route("/filter/")
def my_filter():
name = 'tom'
content = "<h1>过滤器</h1>"
return render_template('filter.html',**locals())
<--filter/-->
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>过滤器</title>
</head>
<body>
<p>
过滤器
{
{ name | upper }}
</p>
<p>
<p>safe不会不会把变量的内容的标签转义</p>
{
{ content | safe}}
<p>autoescap可以把多个变量视为安全,不转义内容