1、渲染jinja2模板和传参
(1)如何渲染模板
-
模板放在’templates’文件夹下;
-
从flask中导入’render_template’函数;
-
在视图函数中,使用’render_template’函数渲染模板。**注意:**只需要填写模板的名字,不需要填写’templates’这个文件夹的路径。
(2)模板传参数 -
如果只有一个或少数参数,直接在’render_template’函数中添加关键字函数就可以了。
示例代码如下:
template.py
@app.route('/')
def index():
return render_template('index.html',username='***',gender='女',age='20')
index.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>首页</title>
{{ username,gender,age}}//固定语法
</head>
<body>
</body>
</html>
- 如果有多个参数的时候,可以先把参数放在字典中,然后在’render_template’中使用两个星号(**),把字典转化成关键字参数传递进去,这样的代码更方便管理和使用。
示例代码如下:
@app.route('/')
def index():
context ={
'username':'***',
'gender':'女',
'age': 20
}
return render_template('index.html',**context)
(3)在模板中,如果要使用一个变量,语法是:’{{params}}’;
(4) 访问模型中的属性或者是字典,可以通过’{{params.property}}‘的形式,或者是使用’{{params[‘age’]}}’。
(5)基本语法
{{ 用来存放变量 }}
{% 用来执行函数或者逻辑代码 %}
2、if判断
语法
{% if XXX %}
{% else %}
{% endif %}
if判断的使用和python里的使用方法差别不大。
3、for循环遍历列表和字典
(1)字典的遍历,语法和’python’一样,可以使用’items()’、‘keys()’、‘values()’、‘iteritems()’、‘iterkey()’、‘itervalue()’;
{%for k,v in user.items()%}
<p>{{ k }}:{{ v }}</p>
{% endfor %}
(2)列表的遍历
{% for website in websites %}
<p>{{ website }}</p>
{% endfor %}
一个案例练习:
app.py
from flask import Flask,render_template
app = Flask(__name__)
@app.route('/')
def index():
books =[
{'name':'西游记',
'author':'吴承恩',
'price':'100'},
{'name':'红楼梦',
'author':'曹雪芹',
'price':'100'},
{'name':'三国演义',
'author':'罗贯中',
'price':'100'}
]
return render_template('index.html',books = books)
if __name__ == '__main__':
app.run(debug=True)
模板 index.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<table>
<thead>
<th>书名</th>
<th>作者</th>
<th>价格</th>
</thead>
<thbody>
{% for book in books %}
<tr>
<td>{{ book.name }}</td>
<td>{{ book.author }}</td>
<td>{{ book.price }}</td>
</tr>
{% endfor %}
</thbody>
</table>
</body>
</html>
4、过滤器
(1)介绍
- 可以在模板中对一些变量进行处理,在模板中,过滤器相当于是一个函数,把当前的变量传入到过滤器中,然后过滤器根据自己的功能,在返回相应的值,之后再把结果渲染到页面中。作用的对象是模板中的变量–{{parmas}};
- 基本语法:{{ variable | 过滤器名字 }},使用管道符号’|'进行组合。
(2)default过滤器:如果当前变量不存在,可以指定默认值;
使用方式{{ value | default(‘默认值’)}},如果value这个key不存在,那么就会使用default过滤器提供的默认值,如果你想使用类似于python中判断一个值是否为False(例如:None、空字符串、空列表、空字典等),那么就必须要传递另外一个参数{{value|default(‘默认值’,boolean=True)}}。
可以使用or来替代default(‘默认值’,boolean=True),如:{{ signature or ‘此人很懒’}}
(3)自动转义过滤器
- safe过滤器:可以关闭一个字符串的自动转义;
- escape过滤器:对某一个字符串进行转义;
- autoescape标签:可以对它里面的代码块关闭或开启自动转义。
{% autoescape off %}
...代码块
{% endautoescape %}
(4)常见过滤器
5、自定义模板过滤器
过滤器本质上就是一个函数,如果在模板中调用这个过滤器,那么就会将这个变量的值作为第一个参数传给过滤器这个函数,然后函数的返回值会作为这个过滤器的返回值,需要使用到一个装饰器,@app.template_filter('cut')
示例代码:
python代码
@app.template_filter('cut')
def cut(value):
value = value.replace('hello','你好')
return value
html
{{ article | cut }}
6、继承和使用block
(1)继承作用和语法
- 作用:可以把一共同代码放在父模板中,避免每个模块写相同的代码;
- 语法:
{% extends 'base.html' %}
(2)block实现:
- 作用:可以让子模板实现一些自己的特定需求,但是父模板需要提前定义好;
- **注意:**子模板中的代码,必须放在block中。
- 语法:
{% block main%}{% endblock %}
7、url链接和加载静态文件
(1)url链接:使用’url_for(视图函数名称)’,可以反转成url;
(2)语法:<a href={{ url_for('login') }}>登录</a>
;
8、加载静态文件
(1)flask结构中的static主要用来存放静态文件,主要包含CSS样式文件,js脚本,图片和字体等;
(2)语法:url_for('static',filename='路径')
;
(3)加载静态文件时,flask会从’static’这个文件夹中去找,所以不用在写’static’这个路径了;
(4)示例加载css样式:
<link rel="stylesheet" href="{{ url_for('static',filename='css/index.css' )}}">