模板对数字、列表、字典和基本函数的引用
app.py
from flask import Flask, render_template
app = Flask(__name__)
@app.route('/index')
def index():
context = {
'k1': 123,
'k2': [12, 23, 34]
'k3': {'name': 'test', 'age': 123}
'k4':lambda x: x + 10
}
return render_template("index.html", **context)
if __name__ == "__main__":
app.run()
templates下index.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>index</title>
</head>
<body>
<!--数字或字符串传值-->
<h1>
{{k1}}
</h1>
<!--列表可以直接点下标或者[]下标,也可以for循环-->
<h1>
{{k2.0}}{{k2[0]}}
</h1>
<h1>
{% for val in k2 %}
{{val}}
{% endfor %}
</h1>
<!--字典取值方式-->
<h1>
{{k3.name}}{{k3['name']}}{{k3.get('name', 888)}}
</h1>
<h1>
{% for key in k3.keys() %}
{{key}}
{% endfor %}
</h1>
<h1>
{% for value in k3.values() %}
{{value}}
{% endfor %}
</h1>
<h1>
{% for x, y in k3.items() %}
{{x}}{{y}}
{% endfor %}
</h1>
<!--函数-->
<h1>
{{k4}}
<!--直接返回lambda函数对象 不执行-->
{{k4(10)}}
<!--需要自己调用才能执行-->
</h1>
</body>
</html>
模板函数引用
from flask import Flask, render_template
app = Flask(__name__)
def gen_input_safe(value):
return Markup("<input value=%s />" % value)
def gen_input(value):
return "<input value=%s />" % value
# 模板中可以直接调用,不需要传值
@app.template_global()
def global_func():
'''
每个模板都可以直接调用的函数
:return: str "Global Func"
'''
return "Global Func"
@app.template_filter()
def test(a1, a2, a3):
'''
同样可以直接调用
传参格式{a1|test(a2, a3)}
'''
return [a1, a2, a3]
@app.route('/index')
def index():
context = {
'k5': gen_input
}
return render_template("index.html", **context)
if __name__ == "__main__":
app.run()
templates下index.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>index</title>
</head>
<body>
<!--函数-->
<!--直接生成'<input value=10 />'不会生成输入框-->
<!--防止xss跨镇脚本攻击-->
<h1>{{k5(10)}}</h1>
<!--方法一加safe-->
<!--方法二:后端修改-->
<h1>{{k5(10)|safe}} {{k6(10)}}</h1>
<!--全局模板函数-->
<h1>{{global_func()}}</h1>
<!--不同传参函数-->
<h1>{{10|test(20,30)}}</h1>
</body>
</html>
模板的继承
layout.html(被继承模板)
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Index</title>
</head>
<body>
<div>
{% block content %}{% endblock %}
</div>
</body>
</html>
layin.html(继承模板)
{% extends 'layout.html' %}
{% block content %}
<!--数字或字符串传值-->
<h1>{{k1}}</h1>
<!--列表可以直接点下标或者[]下标,也可以for循环-->
<h1>{{k2.0}}{{k2[0]}}</h1>
<h1>{% for val in k2 %} {{val}} {% endfor %}</h1>
<!--字典取值方式-->
<h1>{{k3.name}}{{k3['name']}}{{k3.get('name', 888)}}</h1>
<h1>{% for key in k3.keys() %} {{key}} {% endfor %}</h1>
<h1>{% for value in k3.values() %} {{value}} {% endfor %}</h1>
<h1>{% for x, y in k3.items() %} {{x}}{{y}} {% endfor %}</h1>
<!--函数-->
<!--直接返回lambda函数对象 不执行-->
<!--<function index.<locals>.<lambda> at 0x00000248A3438B88>-->
<h1>{{k4}}</h1>
<!--需要自己调用才能执行-->
<h1>{{k4(10)}}</h1>
<!--直接生成'<input value=10 />'不会生成输入框-->
<!--防止xss跨镇脚本攻击-->
<h1>{{k5(10)}}</h1>
<!--方法一加safe-->
<!--方法二:后端修改-->
<h1>{{k5(10)|safe}} {{k6(10)}}</h1>
<!--全局模板函数-->
<h1>{{global_func()}}</h1>
<!--不同传参函数-->
<h1>{{10|test(20,30)}}</h1>
{% endblock %}
等同于于上面的index.html,可以被后端直接重定向。