Flask学习笔记(三)-jinja2 模板入门
一、表达式
jinja2是一个被广泛使用的模板引擎,其设计思想源自于django模板引擎,jinja2扩展了语法,增加了强大的功能,被flask选为内置的模板语言
示例的目录结构如下
./
├── app.py
└── templates
└── name1.html
html文件:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<p>欢迎你 {{ name }} </p>
</body>
</html>
flask请求:
from flask import Flask, render_template
app = Flask(__name__)
@app.route('/name/<string:name>',methods=['GET'])
def name(name):
return render_template("name1.html", name=name)
if __name__ == '__main__':
app.run(debug=True)
启动服务,在浏览器里输入 http://127.0.0.1:5000/name/小风测试

二、flask模板---if语句
示例:
if.html文件
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
{% if name=='管理员' %}
<p>原来你是管理员啊</p>
{% else %}
<p>欢迎你 {{ name }}</p>
{% endif %}
</body>
</html>
flask请求:
from flask import Flask, render_template
app = Flask(__name__)
@app.route('/if/<string:name>',methods=['GET'])
def test_if(name):
return render_template('if.html',name=name)
if __name__ == '__main__':
app.run(debug=True)
启动服务后,在浏览器里输入 http://127.0.0.1:5000/if/小明
页面里会显示
欢迎你 小明
但如果你在浏览器里输入 http://127.0.0.1:5000/if/管理员
页面里则会显示
原来你是管理员啊
两个条件分支无法满足业务需求,你也可以使用 {% elif %} 增加逻辑判断
三、flask模板---for 语句
语法
jinja2 模板中,使用 {% 语句 %} 包围的语法块称为语句,jinja2 支持类似于 Python 的 for 循环语句,语法如下:
示例:
for.html文件
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<h1>Members</h1>
<ul>
{% for user in users %}
<li>{{ user }}</li>
{% endfor %}
</ul>
</body>
</html>
flask请求:
from flask import Flask, render_template
app = Flask(__name__)
users = ['张三', '王五', '刘麻子']
@app.route('/users/3')
def for_test():
return render_template('for.html', users=users)
if __name__ == '__main__':
app.run(debug=True)
启动服务后,在浏览器里输入 http://127.0.0.1:5000/users/3

四、flask模板---模板继承(extends)
对于模板内容重复的问题,Jinja2 提供了模板继承的支持。我们可以定义一个父模板,一般会称之为基模板(base template)。基模板中包含完整的 HTML 结构和导航栏、页首、页脚都通用部分。在子模板里,我们可以使用 extends 标签来声明继承自某个基模板。基模板中需要在实际的子模板中追加或重写的部分则可以定义成块(block)。块使用block 标签创建, {% block 块名称 %} 作为开始标记,{% endblock %} 或 {% endblock 块名称 %} 作为结束标记
示例的目录结构如下
./
├── app.py
└── templates
└── base.html
└── news.html
base.html代码如下:
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<!--预留插入标题位置-->
<title>
{% block title %}
{% endblock %}
</title>
</head>
<body>
<!--导航,内容固定-->
<ul>
<li>
<a href="#">首页</a>
<a href="#">新闻中心</a>
<a href="#">产品中心</a>
<a href="#">联系我们</a>
</li>
</ul>
<!--预留插入网页内容部分-->
{% block content %}
{% endblock %}
</body>
</html>
news.html继承base.html自动生成固定部分,我们仅仅需要在news.html中完善预留插入位置的内容。
{% extends 'base.html' %}
<!--插入到block title位置-->
{% block title %}
新闻中心
{% endblock %}
<!--插入到block content-->
{% block content %}
<h1>新闻中心</h1>
<p>
这里是新闻中心页面
</p>
{% endblock %}
flask请求(app.py):
from flask import Flask, render_template
app = Flask(__name__)
@app.route('/news')
def news():
return render_template('news.html')
if __name__ == '__main__':
app.run(debug=True)
启动服务后,在浏览器里输入http://127.0.0.1:5000/news
效果如下:

五、flask模板---包含(include)
其语法格式为:
{% include '文件夹/模板文件' %}
包含(include)步骤为:
- 定义一个公共部分文件夹,再在文件夹中创建公共部分的模板;
- 哪个页面有该公共部分的内容,就通过include语法使用该公共部分的模板。
公共部分文件夹及模板,模板文件代码(header.html)如下:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>头部</title>
</head>
<body>
<h1>我被包含过来了</h1>
</body>
</html>
写一个welcome.html,其代码如下所示:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>欢迎页面</title>
</head>
<body>
{# 使用公共模板 #}
{% include 'header.html' %}
<div >欢迎学习Flask框架</div>
</body>
</html>
编写app.py视图函数,其代码如下所示:
from flask import Flask,render_template
# 实例化app
app = Flask(__name__)
@app.route('/welcome/')
def welcome():
return render_template('welcome.html')
if __name__ == '__main__':
app.run(debug=True)
运行结果:

六、flask模板---宏(macro)
宏(macro)可以看作为jinja2的一个函数,其返回是一个HTML字符串或者一个模板,为了避免反复地编写同样的模板代码,出现了代码冗余,可以把同样的模板代码写成函数并进行复用。
定义宏(macro)有两种方式:直接在模板中定义宏和把所有用写在一个宏模板文件中。
其语法格式如下:
#定义宏
{% macro 宏名(参数) %}
代码块
{% endmacro %}
#导入宏
{% import '宏文件' as 别名 %}
#使用宏
{{ 别名.宏名(参数) }}
1)在模板中直接定义宏
首先我们创建一个名为macro.html模板文件,其文件内容如下所示:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>宏的定义</title>
</head>
<body>
{# 定义宏 #}
{% macro input(value) %}
<input type="text" placeholder="{{ value }}" name="username">
{% endmacro %}
{# 调用宏 #}
{{ input('提交01') }}
</body>
</html>
这里我们定义了一个名为input的宏,其作用是创建一个提交按钮,然后通过{{ input('参数') }}调用了宏。
2)直接引用宏文件
创建一个模板文件来使用macro1.html宏文件(引用macro.html模板文件),其内容如下所示
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>宏的使用</title>
</head>
<body>
{% import 'macro.html' as f %}
{{ f.input('用户名') }}
</body>
</html>
视图函数代码如下所示:
from flask import Flask,render_template
# 实例化app
app = Flask(__name__)
@app.route('/macro/')
def use_macro():
return render_template('macro.html')
@app.route('/macro1/')
def use_macro1():
return render_template('macro1.html')
if __name__ == '__main__':
app.run(debug=True)
运行结果:
访问:http://127.0.0.1:5000/macro/

访问:http://127.0.0.1:5000/macro1/

七、flask模板---行语句
flask行语句,可以让模板的代码编写更加容易便捷,不然总是用{% ... %} 来标识挺麻烦的, 使用行语句首先需要进行设置(app.py进行设置)
app.jinja_env.line_statement_prefix = '#'
先来看一下不使用行语句时如何写一段for循环
{% for i in range(10) %}
<p>{{ i }}</p>
{% endfor %}
而一旦开启了行语句,你就可以这样写了
# for i in range(10):
<p>{{ i }}</p>
# endfor
我已经设置了行语句的前缀为# ,在模板里,只要一行代码里去掉前面的空白符后是以# 开头的,就视为行语句。
行语句的代码和我们平时写python代码一样,不用那么麻烦的用{% 和 %} 进行标记了。
若有未闭合的圆括号、花括号或方括号,行语句可以跨越多行:
<ul>
# for href, caption in [('index.html', 'Index'),
('about.html', 'About')]:
<li><a href="{{ href }}">{{ caption }}</a></li>
# endfor
</ul>
本文来自博客园,作者:橘子偏爱橙子,转载请注明原文链接:https://www.cnblogs.com/xfbk/p/16727021.html

浙公网安备 33010602011771号