flask的模板渲染
目录
模板引擎传参
在视图函数中
- render_template传参的时候以关键字实参进行传参。可以传多个,可以用**讲字典打散成关键字实参。
在模板中
- jinja2模板引擎支持接收变量在用
{{}}
包裹参数进行接收 - 并且如果发现是字典,可以用
.
字典里面的key取出value值。也可以直接字典跟[]
进行取值。
实例1(第一种传参方式):
目录结构
│ server.py
│
└─templates # 文件夹
index.html
server.py
@app.route('/')
def index():
return render_template('index.html',name="mark",age=18)
index.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>模板传参</title>
</head>
<body>
{{name}}
{{age}}
</body>
</html>
实例2(第二种传参方式):
目录结构:同上
server.py
@app.route('/demo1/')
def demo1():
context_dict = {"name":"mark",
"age":"mark",
"sex":"girl"}
return render_template('index.html',context_dict = context_dict)
index.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>模板传参</title>
</head>
<body>
{{context_dict.name}}
{{context_dict.age}}
{{context_dict.sex}}
</body>
</html>
实例3(第三种传参方式):
目录结构:同上
server.py
def demo2():
context_dict = {"name": "mark",
"age": "mark",
"sex": "girl",
"other_info":{"tel":1365,
"qq":565656}}
return render_template('index.html',**context_dict)
index.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>模板传参</title>
</head>
<body>
{{name}}
{{age}}
{{sex}}
{{other_info.tel}}
{{other_info["qq"]}}
</body>
</html>
模板中使用url_for()
在模板中如果有使用url的需求,我们可以直接手写一个url,也可以使用{{ url_for('视图函数名') }
动态翻转一个url。
实例:
项目目录:
│ server.py
│
└─templates # 文件夹
index.html
info.html
server.py
@app.route('/')
def index():
return render_template('index.html', name="mark", age=18)
@app.route('/info/')
def info():
return render_template('info.html')
info.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>信息页面</title>
</head>
<body>
<h1>这是信息页面</h1>
</body>
</html>
index.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>模板传参</title>
</head>
<body>
<a href="/info/">正常跳转</a>
<a href="{{ url_for('info') }}">urlfor跳转</a>
</body>
</html>
Markup转换变量中的特殊字符
在模板渲染中,使用Markup转换变量中的特殊字符,Markup对字符串进行转译处理再传递给render_template()函数
markup是在后台处理数据
from flask import Flask, render_template, Markup
app = Flask(__name__)
app.debug = True
def func1(arg, tank):
# 在模板渲染中,使用Markup转换变量中的特殊字符,Markup对字符串进行转译处理再传递给render_template()函数
# 前台可使用{{ ht1("json", "tank") }}进行传参
return Markup(f"<h1>饼哥真帅,{arg} is sb {tank} is same as {arg}</h1>")
@app.route("/")
def index():
return render_template("index.html", ht1=func1)
if __name__ == '__main__':
app.run()
<body>
<h1>我是index页面</h1>
<table>
{{ ht1("jason", "tank") }}
</body>
safe将html生成安全的文本
safe是在前台处理数据
from flask import Flask, render_template, Markup
app = Flask(__name__)
app.debug = True
@app.route("/")
def index():
# 前台想要解析ht标签,需要使用模板语法的safe,例如:{{ ht| safe }}
return render_template("index.html", ht="<h1>饼哥真帅</h1>")
if __name__ == '__main__':
app.run()
<body>
{{ ht|safe }}
</body>
jinja2中模板语法之for循环
for
循环可以便利任何一个可迭代对象,包括列表、字典等,支持反向遍历
反向遍历实例
server.py
的 {% for country in countrys %}
改为 {% for country in countrys|reverse %}
for循环常用变量表
for循环常用变量 | 功能描述 |
---|---|
loop.index | 当前循环的索引(从1开始) |
loop.index0 | 当前循环的索引(从0开始) |
loop.first | 是否是第一次循环,是返回True,否则返回Flase |
loop.last | 是否是最后一次循环,是返回True,否则返回Flase |
loop.length | 总共可以循环的次数 / 迭代器的长度 |
for循环中的else用法
for还可以else分支语法,如果for内部没有遍历出来内容,那么就会走else分支,反之如果for循环遍历出了内容,则不会运行else分支。
注意:jinja2
中的for
和 else
逻辑不通于python
在此不要类比python中的 for
和 else
。
{% for country in countrys|reverse %}
<p>{{ country }}</p>
{% else %}
<p>没有值</p>
{% endfor %}
示例代码:
from flask import Flask, render_template, Markup
app = Flask(__name__)
app.debug = True
USERS = {
1: {'name': '张三', 'age': 18, 'gender': '男', 'text': "道路千万条"},
2: {'name': '李四', 'age': 28, 'gender': '男', 'text': "安全第一条"},
3: {'name': '王五', 'age': 18, 'gender': '女', 'text': "行车不规范"},
}
@app.route("/")
def index():
return render_template("index.html", user=USERS)
if __name__ == '__main__':
app.run()
<body>
<h1>我是index页面</h1>
<table>
{% for k, v in user.items() %}
<tr>
<td>{{k}}</td>
<td>{{v.name}}</td>
<td>{{v['name']}}</td>
<td>{{v.get('name')}}</td>
<td>{{url_for('index')}}</td>
</tr>
{% endfor %}
</table>
</body>
jinja2模板语法之if语句
示例代码:
from flask import Flask, render_template, Markup
app = Flask(__name__)
app.debug = True
@app.route("/")
def index():
return render_template("index.html", name="jason")
if __name__ == '__main__':
app.run()
<body>
<h1>我是index页面</h1>
<div>{{name}}</div>
{% if name == "jason"%}
<h1>is sb</h1>
{% else %}
<h1>帅哥</h1>
{% endif %}
</body>