在之前的helloworld中,访问根目录,我们返回了一个
flask用模板解决此类场景。
模板是一个包含响应文件的文件,其中包括用占位变量表示的动态部分,其具体值只在请求的上下文中才能知道。使用真实值替换变量,再返回最终得到的响应字符串,这一过程称为渲染。
为了渲染模板,flask使用了一种名为jinja2的强大模板引擎。
1:渲染模板
实际开发中,一般会将html文件都保存到工程下的templates目录中。示例:index.html
在视图函数中,用render_template,渲染index.html,并传入参数。
render_template函数集成jinja2引擎,第一个参数是模板的文件名,随后的参数都是键值对。
比如,name=name,左侧是形参,与模板中保持一致,右侧是index函数接收的具体值
2:变量
{{ name }}表示一个变量。这是一种特殊的占位符,它告诉模板引擎这个位置的值要从渲染模板时使用的数据中获取。
jinja模板能够识别很多类型的变量甚至复杂类型的变量
在视图函数中定义相关变量及类(类必须实例化),然后渲染
然后在浏览器中查看效果
jinja模板支持用过滤器修改变量 ,过滤器名添加在变量名之后,中间用竖线分割,例如
常用过滤器如下:
过滤器名 | 说明 |
safe | 渲染值时不转义 |
capitalize | 把值的首字母转换成大写,其他字母转换成小写 |
lower | 把值转换成小写形式 |
upper | 把值转换成大写形式 |
title | 把值中每个单词的首字母都转换成大写 |
trim | 把值的首尾空格去掉 |
striptags | 渲染之前把值中所有的HTML标签都删掉 |
在默认情况下,jinja会转义所有变量。当变量值中包含html标签,并且需要显示时,可以使用safe过滤器
3:控制语句
jinja2提供了多种控制结构,可用来改变模板的渲染流程。
1>条件控制
{% if XXX %}
……
{% else %}
……
{% endif %}
实例:
不再传递user参数:
2>循环
{% for XXX in XXX%}
……
{% endfor %}
实例:
视图函数及运行结果
4:宏
jinja2支持宏。(宏是一种规则或模式,或称语法替换 ,用于说明某一特定输入(通常是字符串)如何根据预定义的规则转换成对应的输出(通常也是字符串)。这种替换在预编译时进行,称作宏展开。)
定义宏:
使用宏:
为了重复使用宏,还可以将宏,可以将其单独保存到一份文件中,然后在需要使用的模板中导入:
5:基模板
不仅宏需要重复使用,界面显示也有很多内容是需要重复的。可以用基模板来完成。
模板继承类似于Python中的类继承,
我们可以自己定义一个基模板,将重复部分都写入基模板中,其他模板只需继承即可。
假如,搜索框需要重复使用:
在某模板继承了此基模板后,搜索框部分无需再重复写代码,只需填入title和content的内容即可:
结果展示:
6:flask_Bootstrap
前端开发中有个很强大的框架叫bootstrap。flask对此同样有集成。
安装:pip install flask-bootstrap
导入:from flask_bootstrap import Bootstrap
实例化:bootstrap=Bootstrap(app)
实例化之后,我们得到了一个bootstrap的基模板。类似这样:
我们可以直接继承bootstrap下的base.html,也可以自己写base.html,其中继承bootstrap,然后再将其作为自己的基模板。
继承bootstrap提供的基模板的好处在于,其中提供了网页框架,引入了boostrap中所有的CSS和JavaScript。
PS:若模板继承时,要对已有内容的模块增加新内容,必须使用super()函数。
{{ super() }}