说明:模板文件就是按照一定的规则书写的展示效果的HTML文件 模板引擎就是负责按照指定规则进行替换的工具
模板引擎选择jinja2
一、渲染模板的方法
1、将渲染的模板进行返回
1
|
render_template()
|
2、渲染字符串返回
1
|
render_templates_string()
|
实例
1
2
3
4
5
6
|
@app .route( '/' )
def index():
#将模板内容响应给用户
return render_template( 'index.html' )
#渲染一内容响应给用户
return render_template_string( '<h1 style="color:green;font-size:18px;">原谅色</h1>' )
|
二、模板的语法
模板中只存在俩种语法
1、变量
{{ var }}
1
2
3
|
#像模板文件中传参
return render_template( 'index.html' ,title = '首恶' )
{{ title }}
|
2、标签
{% 标签名 %}
注意:
在模板中使用字典中的键 需要像使用对象得方式来调用
{{data.key}}
如果在模板中给定的变量不存在 则插入的是空字符串 不会报错
三、过滤器
过滤器使用管道符 | 来使用的
1、{{ var|abs }} 返回一个数值的绝对值
2、default 设置默认值
只有当给定的变量不存在时 则执行默认值
当设置default的boolean的时候 会执行默认值
1
|
< li >{{ data.bool|default('我是默认值',boolean=True) }}</ li >
|
3、first: 取出变量中的第一个字符
4、last: 取出变量中的最后一个字符
5、format: 字符的格式化
1
|
<li>{{ '我叫%s 我今年%d岁了 我的存款为 %.2f' | format ( '罗铁汉' , 38 , 23 ) }}< / li>
|
6、length: 返回变量值的长度
7、join: 拼接成字符串
1
2
|
<li>{{ [ 1 , 2 , 3 , 4 ]|join('') }}< / li>
<li>{{ [ 1 , 2 , 3 , 4 ]|join( 'x' ) }}< / li>
|
8、safe: 不转义标签 原样显示
9、lower 转为小写
10、upper 转为大写
11、replace 替换
1
|
<li>{{ data.string|replace( 'a' , 'x' ) }}< / li>
|
12、striptages 去除HTML标签
{{ data.html|striptags }}
四、标签
语法格式 :{% 标签名 %}
(1) if
实例
1
2
3
4
5
6
7
|
{ % if data. bool % }
<li>{{ data. bool }}值为真< / li>
{ % elif True % }
<li>{{ True }}职位真< / li>
{ % else % }
<li>{{ data. bool }}值为假< / li>
{ % endif % }
|
(2) for 循环
实例
1
2
3
4
5
6
7
|
{ % for i in data.xxxx % }
{ # 错误的迭代方法TypeError: 'bool' object is not iterable #}
{ # {% for i in data.bool %}#}
<li>{{ i }}< / li>
{ % else % }
<li>当迭代的变量不存在时 则执行 else < / li>
{ % endfor % }
|
注意:
break continue 不能够在这里使用
迭代字典
1
2
3
|
{ % for k,v in data.items() % }
<li>{{ k }} = >{{ v }}< / li>
{ % endfor % }
|
获取当前迭代的状态
变量 | 描述 |
---|---|
loop.index | 获取当前迭代的索引 从1开始 |
loop.index0 | 获取当前迭代的索引 从0开始 |
loop.first | 是否为第一次迭代 |
loop.last | 是否为最后一次迭代 |
loop.length | 迭代的长度 |
六、注释
{# 多行注释 #}
七、文件包含 include
相当于把一个文件 拷贝到当前的你的包含的位置
实例
1
2
3
|
{ % include 'common/header.html' % }
<div>我是中间的内容< / div>
{ % include 'common/footer.html' % }
|
注意:
1、包含的公共的文件中 只存放 公共的代码 除此以外什么都不要存在
2、导入的时候 如果文件和在同一级别 直接导入就可以 如果包含在某个目录中 需要写出路径
1
2
|
{ % include 'common/header.html' % }
{ % include 'test.html' % }
|
八、宏 macro
概念: 类似python中的函数
实例
在macro.html中
1
2
3
|
{% macro input(name,type='text',value='') %}
< input type = "{{ type }}" name = "{{ name }}" value = "{{ value }}" >
{% endmacro %}
|
宏的调用
1
2
3
|
{{ input ( 'text' , 'username' ,'') }}
{{ input () }}
{{ input ( type = 'password' ,name = 'userpass' ) }}
|
宏的导入
(1) import
1
2
3
|
{ % import 'test.html' as test % }
{ % import 'common/test.html' as test % }
<p>用户名: {{ test. input ( type = 'password' ,name = 'userpass' ) }}< / p>
|
(2) form import
1
2
3
|
{ % from 'test.html' import input % }
{ % from 'common/test.html' import input % }
<p>用户名: {{ input ( type = 'password' ,name = 'userpass' ) }}< / p>
|
注意:
- 宏的调用只能在定义的下方去调用 否则未定义
- 宏如果存在形参 且没有默认值 则可以调用(没意义)
- 形参的默认值 需要遵循默认值规则 有默认值的参数 放右侧
- 可以正常使用 关键字参数
九、继承 extends
语法:
- {% extends %} 继承某个模板
- {% block %} 挖坑和填坑
- {{ super() }} 调用被替换掉的代码
base.html
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
|
<!DOCTYPE html>
< html lang = "en" >
< head >
{% block header %}
< meta charset = "UTF-8" >
{% block meta %}
{% endblock %}
< title >{% block title%}首页{% endblock %}</ title >
< style >
{% block style %}
p{color:red;}
{% endblock %}
</ style >
{% block link %}
{% endblock %}
{% block script %}
{% endblock %}
{% endblock %}
</ head >
< body >
< header >头部</ header >
{% block con %}
我是中间的内容部分
{% endblock %}
< footer >尾部</ footer >
</ body >
</ html >
|
index.html继承 base.html
1
2
3
4
5
6
7
8
9
10
11
12
|
{ % extends 'common/base.html' % }
{ % block title % }
我的首页
{ % endblock % }
{ % block style % }
{{ super () }}
p{color:green;}
{ % endblock % }
{ % block con % }
<p>我是首页的内容< / p>
我是首页的内容
{ % endblock % }
|
注意:
如果当替换某个样式的时候 所有原来的样式 都消失了 去查看是否使用了super()
十、flask-bootstrap
安装
1
2
3
|
pip install flask-bootstrap
sudo pip3 install flask-bootstrap
|
使用
继承 bootstrap/base.html 基础模板 改造成适用于自己网站的base.html基础模板
自己的base.html
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
|
{% extends 'bootstrap/base.html' %}
{% block navbar %}
< nav class = "navbar navbar-inverse" style = "border-radius: 0px;" >
< div class = "container-fluid" >
<!-- Brand and toggle get grouped for better mobile display -->
< div class = "navbar-header" >
< button type = "button" class = "navbar-toggle collapsed" data-toggle = "collapse"
data-target = "#bs-example-navbar-collapse-1" aria-expanded = "false" >
< span class = "sr-only" >Toggle navigation</ span >
< span class = "icon-bar" ></ span >
< span class = "icon-bar" ></ span >
< span class = "icon-bar" ></ span >
</ button >
< a class = "navbar-brand" href = "#" rel = "external nofollow" rel = "external nofollow" rel = "external nofollow" rel = "external nofollow" rel = "external nofollow" rel = "external nofollow" rel = "external nofollow" rel = "external nofollow" rel = "external nofollow" rel = "external nofollow" rel = "external nofollow" >< span class = "glyphicon glyphicon-signal" aria-hidden = "true" ></ span ></ a >
</ div >
<!-- Collect the nav links, forms, and other content for toggling -->
< div class = "collapse navbar-collapse" id = "bs-example-navbar-collapse-1" >
< ul class = "nav navbar-nav" >
< li class = "active" >< a href = "#" rel = "external nofollow" rel = "external nofollow" rel = "external nofollow" rel = "external nofollow" rel = "external nofollow" rel = "external nofollow" rel = "external nofollow" rel = "external nofollow" rel = "external nofollow" rel = "external nofollow" rel = "external nofollow" >首页 < span class = "sr-only" >(current)</ span ></ a ></ li >
< li >< a href = "#" rel = "external nofollow" rel = "external nofollow" rel = "external nofollow" rel = "external nofollow" rel = "external nofollow" rel = "external nofollow" rel = "external nofollow" rel = "external nofollow" rel = "external nofollow" rel = "external nofollow" rel = "external nofollow" >发帖子</ a ></ li >
</ ul >
< ul class = "nav navbar-nav navbar-right" >
< form class = "navbar-form navbar-left" >
< div class = "form-group" >
< input type = "text" class = "form-control" placeholder = "Search" >
</ div >
< button type = "submit" class = "btn btn-default" >Submit</ button >
</ form >
< li >< a href = "#" rel = "external nofollow" rel = "external nofollow" rel = "external nofollow" rel = "external nofollow" rel = "external nofollow" rel = "external nofollow" rel = "external nofollow" rel = "external nofollow" rel = "external nofollow" rel = "external nofollow" rel = "external nofollow" >注册</ a ></ li >
< li >< a href = "#" rel = "external nofollow" rel = "external nofollow" rel = "external nofollow" rel = "external nofollow" rel = "external nofollow" rel = "external nofollow" rel = "external nofollow" rel = "external nofollow" rel = "external nofollow" rel = "external nofollow" rel = "external nofollow" >登录</ a ></ li >
< li class = "dropdown" >
< a href = "#" rel = "external nofollow" rel = "external nofollow" rel = "external nofollow" rel = "external nofollow" rel = "external nofollow" rel = "external nofollow" rel = "external nofollow" rel = "external nofollow" rel = "external nofollow" rel = "external nofollow" rel = "external nofollow" class = "dropdown-toggle" data-toggle = "dropdown" role = "button" aria-haspopup = "true"
aria-expanded = "false" >个人中心 < span class = "caret" ></ span ></ a >
< ul class = "dropdown-menu" >
< li >< a href = "#" rel = "external nofollow" rel = "external nofollow" rel = "external nofollow" rel = "external nofollow" rel = "external nofollow" rel = "external nofollow" rel = "external nofollow" rel = "external nofollow" rel = "external nofollow" rel = "external nofollow" rel = "external nofollow" >个人信息</ a ></ li >
< li >< a href = "#" rel = "external nofollow" rel = "external nofollow" rel = "external nofollow" rel = "external nofollow" rel = "external nofollow" rel = "external nofollow" rel = "external nofollow" rel = "external nofollow" rel = "external nofollow" rel = "external nofollow" rel = "external nofollow" >修改头像</ a ></ li >
< li >< a href = "#" rel = "external nofollow" rel = "external nofollow" rel = "external nofollow" rel = "external nofollow" rel = "external nofollow" rel = "external nofollow" rel = "external nofollow" rel = "external nofollow" rel = "external nofollow" rel = "external nofollow" rel = "external nofollow" >修改密码</ a ></ li >
< li role = "separator" class = "divider" ></ li >
< li >< a href = "#" rel = "external nofollow" rel = "external nofollow" rel = "external nofollow" rel = "external nofollow" rel = "external nofollow" rel = "external nofollow" rel = "external nofollow" rel = "external nofollow" rel = "external nofollow" rel = "external nofollow" rel = "external nofollow" >Separated link</ a ></ li >
< li role = "separator" class = "divider" ></ li >
< li >< a href = "#" rel = "external nofollow" rel = "external nofollow" rel = "external nofollow" rel = "external nofollow" rel = "external nofollow" rel = "external nofollow" rel = "external nofollow" rel = "external nofollow" rel = "external nofollow" rel = "external nofollow" rel = "external nofollow" >退出登录</ a ></ li >
</ ul >
</ li >
</ ul >
</ div > <!-- /.navbar-collapse -->
</ div > <!-- /.container-fluid -->
</ nav >
{% endblock %}
{% block content %}
< div class = "container" >
{% block pagecontent %}
网页的中间内容部分写在当前的位置
{% endblock %}
</ div >
{% endblock %}
|
使用 index.html
1
2
3
4
|
{% extends 'common/base.html' %}
{% block title %}
首页
{% endblock %}
|
十一、错误页面的定制
manage.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
@app .errorhandler( 404 )
def page_not_found(e):
return render_template( 'common/error.html' ,error = e,code = 404 )
@app .errorhandler( 500 )
def server_error(e):
return render_template( 'common/error.html' ,error = e,code = 500 )
error.html
{ % extends 'common/base.html' % }
{ % block title % }
{{ code }}错误
{ % endblock % }
{ % block pagecontent % }
<div class = "alert alert-danger" role = "alert" >{{ error }}< / div>
{ % endblock % }
|
十二、视图传递多个参数
(1) 原始传参
1
2
3
|
@app .route( '/' )
def index():
return render_template( 'index.html' ,arg1 = 1 ,arg2 = 2. ..)
|
(2) 使用字典
1
2
3
4
5
|
@app .route( '/' )
def index():
return render_template( 'index.html' ,arg = {arg1: 1 ,arg2: 2. ..})
kwarg = {arg1: 1 ,arg2: 2. ..}
return render_template( 'index.html' ,``)
|
(3) 使用全局变量g
1
2
3
4
5
|
@app .route( '/' )
def index():
g.name = '张三'
g.age = 18
return render_template( 'index.html' )
|
模板中
1
2
3
4
|
< ol >
< li >{{ g.name }}</ li >
< li >{{ g.age }}</ li >
</ ol >
|
(4) 使用 **locals()
1
2
3
4
5
6
|
@app .route( '/' )
def index():
name = '张三'
age = 18
print ( locals ())
return render_template( 'index.html' , * * locals ())
|
模板中
1
2
|
< li >{{ name }}</ li >
< li >{{ age }}</ li >
|
十三、url_for 构造绝对的链接地址
1
2
3
4
|
@app .route( '/test/' )
def test():
print (url_for( 'index' ,_external = True ))
return 'test'
|
十四、加载静态资源
静态资源:图片,css,js,视频,音频,,
实例
1
|
< img src = "{{ url_for('static',filename='img/17.jpg') }}" alt = "" >
|
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持服务器之家。
原文链接:https://segmentfault.com/a/1190000015205323