1、有关模板路径
(1) 在渲染模版的时候,默认会从项目根目录下的templates目录下查找模版。
(2) 如果不想把模版文件放在templates目录下,那么可以在Flask初始化的时候指定template_folder来指定模版的路径。
2、有关模板参数
(1) 在使用render_template渲染模版的时候,可以传递关键字参数。以后直接在模版中使用就可以了。
(2)如果你的参数过多,那么可以将所有的参数放到一个字典中,然后在传这个字典参数的时候,使用两个星号,将字典打散成关键参数。
3、url_for
模版中的url_for跟我们后台视图函数中的url_for使用起来基本是一模一样的。也是传递视图函数的名字,也可以传递参数。
使用的时候,需要在url_for左右两边加上一个{{ url_for('func') }}
4、过滤器
(1)什么是过滤器,语法是什么:
- 有时候我们想要在模版中对一些变量进行处理,那么就必须需要类似于Python中的函数一样,可以将这个值传到函数中,然后做一些操作。在模版中,过滤器相当于是一个函数,把当前的变量传入到过滤器中,然后过滤器根据自己的功能,再返回相应的值,之后再将结果渲染到页面中。
- 基本语法:
{{ variable|过滤器名字 }}。使用管道符号|进行组合。
(2)常用过滤器:
- default过滤器:
使用方式{{ value|default('默认值') }}。如果value这个key不存在,那么就会使用default过滤器提供的默认值。如果你想使用类似于python中判断一个值是否为False(例如:None、空字符串、空列表、空字典等),那么就必须要传递另外一个参数{{ value|default('默认值',boolean=True) }}。
可以使用or来替代default('默认值',boolean=True)。例如:{{ signature or '此人很懒,没有留下任何说明' }}。 - 自动转义过滤器:
safe过滤器:可以关闭一个字符串的自动转义。escape过滤器:对某一个字符串进行转义。autoescape标签,可以对他里面的代码块关闭或开启自动转义。{% autoescape off/on %} ...代码块 {% endautoescape %}
(3)最常用过滤器:
-
first(value):返回一个序列的第一个元素。names|first。
format(value,*arags,**kwargs):格式化字符串。例如以下代码:{{ "%s" - "%s"|format('Hello?',"Foo!") }}将输出:Helloo? - Foo! -
last(value):返回一个序列的最后一个元素。示例:names|last。
-
length(value):返回一个序列或者字典的长度。示例:names|length。
-
join(value,d=u’’):将一个序列用d这个参数的值拼接成字符串。
-
safe(value):如果开启了全局转义,那么safe过滤器会将变量关掉转义。示例:content_html|safe。
-
int(value):将值转换为int类型。
-
float(value):将值转换为float类型。
-
lower(value):将字符串转换为小写。
-
upper(value):将字符串转换为小写。
-
replace(value,old,new): 替换将old替换为new的字符串。
-
truncate(value,length=255,killwords=False):截取length长度的字符串。
-
striptags(value):删除字符串中所有的HTML标签,如果出现多个空格,将替换成一个空格。
-
trim:截取字符串前面和后面的空白字符。
-
string(value):将变量转换成字符串。
-
wordcount(s):计算一个长字符串中单词的个数。
(4)自定义模版过滤器:
过滤器本质上就是一个函数。如果在模版中调用这个过滤器,那么就会将这个变量的值作为第一个参数传给过滤器这个函数,然后函数的返回值会作为这个过滤器的返回值。需要使用到一个装饰器:@app.template_filter('cut')
@app.template_filter('cut')
def cut(value):
value = value.replace("hello",'')
return value
<p>{{ article|cut }}</p>
5、if条件判断语句
if条件判断语句使用格式为{% if statement %},并且还必须有结束的标签{% endif %}。
和python中的类似,可以使用>,<,<=,>=,==,!=来进行判断,也可以通过and,or,not,()来进行逻辑合并操作。
6、 for循环语句
在jinja2中的for循环,跟python中的for循环基本上是一模一样的。也是for...in...的形式。
并且也可以遍历所有的序列以及迭代器。但是唯一不同的是,jinja2中的for循环没有break和continue语句。
7、宏:
模板中的宏跟python中的函数类似,可以传递参数,但是不能有返回值,可以将一些经常用到的代码片段放到宏中,然后把一些不固定的值抽取出来当成一个变量。
使用宏的时候,参数可以为默认值。相关示例代码如下:
- 定义宏:
{% macro input(name, value='', type='text') %} <input type="{{ type }}" name="{{ name }}" value="{{ value }}"> {% endmacro %} - 使用宏:
<p>{{ input('username') }}</p> <p>{{ input('password', type='password') }}</p> - 导入宏:
-
import "宏文件的路径" as xxx。 -
from '宏文件的路径' import 宏的名字 [as xxx]。 -
宏文件路径,不要以相对路径去寻找,都要以
templates作为绝对路径去找。 -
如果想要在导入宏的时候,就把当前模版的一些参数传给宏所在的模版,那么就应该在导入的时候使用
with context。示例:from 'xxx.html' import input with context。
-
8、 include标签
- 这个标签相当于是直接将指定的模版中的代码复制粘贴到当前位置。
include标签,如果想要使用父模版中的变量,直接用就可以了,不需要使用with context。include的路径,也是跟import一样,直接从templates根目录下去找,不要以相对路径去找。
9、set、with语句笔记
(1)set语句
在模版中,可以使用set语句来定义变量。示例如下:
{% set username='admin' %}
<p>用户名:{{ username }}</p>
一旦定义了这个变量,那么在后面的代码中,都可以使用这个变量,就类似于Python的变量定义是一样的。
(2) with 语句
with语句定义的变量,只能在with语句块中使用,超过了这个代码块,就不能再使用了。示例代码如下:
{% with classroom = '五班' %}
<p>班级:{{ classroom }}</p>
{% endwith %}
with语句也不一定要跟一个变量,可以定义一个空的with语句,以后在with块中通过set定义的变量,就只能在这个with块中使用了:
{% with %}
{% set classroom = '五班' %}
<p>班级:{{ classroom }}</p>
{% endwith %}
10、 静态文件
加载静态文件使用的是url_for函数。然后第一个参数需要为static,第二个参数需要为一个关键字参数filename='路径'。
示例:
{{ url_for("static",filename='xxx') }}
路径查找,要以当前项目的static目录作为根目录。
11、模版继承
(1)为什么需要模版继承?
模版继承可以把一些公用的代码单独抽取出来放到一个父模板中。以后子模板直接继承就可以使用了。这样可以重复性的代码,并且以后修改起来也比较方便。
(2) 模版继承语法
使用extends语句,来指明继承的父模板。父模板的路径,也是相对于templates文件夹下的绝对路径。
示例代码如下:
{% extends "base.html" %}
(3) block语法
一般在父模版中,定义一些公共的代码。子模板可能要根据具体的需求实现不同的代码。这时候父模版就应该有能力提供一个接口,让父模板来实现。从而实现具体业务需求的功能。
在父模板中:
{% block block的名字 %}
{% endblock %}
在子模板中:
{% block block的名字 %}
子模板中的代码
{% endblock %}
(4)调用父模版代码block中的代码:
默认情况下,子模板如果实现了父模版定义的block。那么子模板block中的代码就会覆盖掉父模板中的代码。如果想要在子模板中仍然保持父模板中的代码,那么可以使用{{ super() }}来实现。示例如下:
父模板:
{% block body_block %}
<p style="background: red;">这是父模板中的代码</p>
{% endblock %}
子模板:
{% block body_block %}
{{ super() }}
<p style="background: green;">我是子模板中的代码</p>
{% endblock %}
(5)调用另外一个block中的代码:
如果想要在另外一个模版中使用其他模版中的代码。那么可以通过{{ self.其他block名字() }}就可以了。示例代码如下:
{% block title %}
首页
{% endblock %}
{% block body_block %}
{{ self.title() }}
<p style="background: green;">我是子模板中的代码</p>
{% endblock %}
(6)其他注意事项:
- 子模板中的代码,第一行,应该是
extends。 - 子模板中,如果要实现自己的代码,应该放到block中。如果放到其他地方,那么就不会被渲染。
953

被折叠的 条评论
为什么被折叠?



