Flask框架【五】—Jinja2模板语法
Jinja2模板语法
1.模板语法
jinja2的模板语法和django中的模板语法几乎是一模一样的。
-
变量的引用:{{ 变量 }}
-
逻辑语法:{% 逻辑词法 %}
-
过滤器:{{ 变量 | 过滤器 }}
模板继承的语法:和django也是一样的,通过extends和block块来实现模板继承和个性化定制。
1.jinja2中的for
{% for foo in g %} 逻辑语句 {% endfor %}
2.jinja2中的if语句
{% if 条件1 %} {% elif 条件2 %} {% else %} {% endif %}
3.jinja2中的字典和方法
注意:有一点区别,就是字典的取值,或者是方法的调用。
在django中,只能使用不带参数的方法,并且使用万能句点号来使用
{{ dic.name }} # 字典的键name对应的值
{{ request.get_full_path }} # 调用方法,不能带参数,省略括号
而在Jinja2的语法中,字典的取值出了句点,还可以通过键取,以及get方法取值,方法的调用可以直接传递参数。
# 字典的取值
{{ dic.name }}
{{ dic.get("name") }}
{{ dic.["name"] }}
# 方法的调用
{{ func(a,b) }}
2.安全显示标签
为了方式xss攻击,标签在渲染时加上了验证,默认在页面是以字符串的形式显示,可以通过两种方式来解决
1.在后端Markup
tag = Markup("<input type='text' />") return(tag)
2.前端使用过滤器
{{ tag|safe }}
3.自定义方法
flask中可以直接定义方法,返回给前端,供前端调用。
def test(a,b): return a+b @app.route('/index') def index(): return render_template("index2.html",test=test) # index2.html页面使用自定义方法 <h1>{{ test(1,2) }}</h1>
3.全局方法
写一个函数,能够在所有的页面中直接使用,通过template_global和template_filter装饰器实现。
@app.template_global() # 装饰一个全局的方法,比较少用 def sb(a1, a2): return a1 + a2 @app.template_filter() # 装饰一个全局的过滤器 def db(a1, a2, a3): return a1 + a2 + a3
前端调用方式
{{ sb(1,2) }}
{{ 1|db(2,3) }}
4.宏的定义
只有的定义的东西在很多地方使用的时候才会使用,使用macro标签来实现
{% macro input(name, type='text', value='') %} <input type="{{ type }}" name="{{ name }}" value="{{ value }}"> {% endmacro %} {{ input('name1') }} # 调用宏
5.使用实例
flask-jinja2.py
from flask import Flask,render_template,Markup STUDENT_LIST = [ {'name': 'Old', 'age': 38, 'gender': '中'}, {'name': 'Boy', 'age': 73, 'gender': '男'}, {'name': 'EDU', 'age': 84, 'gender': '女'} ] STUDENT_DICT = { 1: {'name': 'Old', 'age': 38, 'gender': '中'}, 2: {'name': 'Boy', 'age': 73, 'gender': '男'}, 3: {'name': 'EDU', 'age': 84, 'gender': '女'}, } app = Flask(__name__) app.debug = True @app.template_global() def sum(a,b): return a + b @app.route("/test") def test(): my_input = Markup("用户名:<input type='text' name='uname'>") return render_template("test.html", stu_list=STUDENT_LIST, stu_dict=STUDENT_DICT, m=my_input) if __name__ == '__main__': app.run("0.0.0.0",8520)
test.html
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> {{ stu_list }} <table border="1px"> <thead> <tr> <th>name</th> <th>age</th> <th>gender</th> </tr> </thead> <tbody> {% for foo in stu_list %} <tr> <td>{{ foo.name }}</td> <td>{{ foo.get("age") }}</td> <td>{% if foo["gender"] != "男" and foo["gender"] != "女" %} 女 {% else %} {{ foo["gender"] }} {% endif %} </td> </tr> {% endfor %} </tbody> </table> {{ stu_dict }} <table border="1px"> <thead> <tr> <th>id</th> <th>name</th> <th>age</th> <th>gender</th> </tr> </thead> <tbody> {% for id,stu in stu_dict.items() %} <tr> <td>{{ id }}</td> <td>{{ stu.name }}</td> <td>{{ stu.get("age") }}</td> <td>{{ stu["gender"] }}</td> </tr> {% endfor %} </tbody> </table> {{ m }} </body> </html>
6.jinja2模板引用include
login.html文件
<form> 用户名:<input type="text" name="user"> 密码:<input type="text" name="pwd"> </form>
index.html文件
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <h1>Welcome OldboyEDU</h1> <h2>下面的内容是不一样的</h2> {% include "login.html" %} <h2>上面的内容是不一样的,但是下面的内容是一样的</h2> <h1>OldboyEDU is Good</h1> </body> </html>
后端代码
from flask import Flask from flask import render_template app = Flask(__name__) @app.route("/") def index(): return render_template("index.html") app.run("0.0.0.0", 5000, debug=True)
衣带渐宽终不悔,为伊消得人憔悴!