flask框架下的jinja2模板引擎(3)(模板继承与可以在模板使用的变量、方法)
flask 框架下的jinja2模块引擎(1):https://www.cnblogs.com/chichung/p/9774556.html
flask 框架下的jinja2模块引擎(2):https://www.cnblogs.com/chichung/p/9775099.html
本文主要记录下 jinja2 的模板继承。
-
模板继承是什么?
在模板中,可能会遇到以下情况:
- 多个模板具有完全相同的顶部和底部内容
- 多个模板中具有相同的模板代码内容,但是内容中部分值不一样
- 多个模板中具有完全相同的 html 代码块内容
像遇到这种情况,可以使用 JinJa2 模板中的 继承 来进行实现
模板继承是为了重用模板中的公共内容。一般Web开发中,继承主要使用在网站的顶部菜单、底部。这些内容可以定义在父模板中,子模板直接继承,而不需要重复书写。
- 相当于在父模板中挖个坑,当子模板继承父模板时,可以进行填充。
- 子模板使用 extends 指令声明这个模板继承自哪个模板
- 父模板中定义的块在子模板中被重新定义,在子模板中调用父模板的内容可以使用super()
-
模板继承的使用
例如有一个父模板 base.html 。有两个子模板01.html 和 02.html 都是继承该模板的某一部分。
base.html 如下:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>{% block title %}Title{% endblock title %}</title> </head> <body> <p>父模板的头部,每个网页都一样的,不需要更改</p> {% block content %} <p>父模板的中间部分,每个网页都不一样的,需要更改</p> {% endblock content %} <p>父模板的脚部,每个网页都一样的,不需要更改</p> </body> </html>
{% block xxx %} 与 {% endblock xxx %} 的中间可以进行替换。而其他的内容可以继承。模板继承可以极大地提高开发效率。
01.html 如下:
{% extends "base.html" %} {% block title %} <p>01的标题</p> {% endblock title %} {% block content %} <p>01页面独有的内容</p> {% endblock content %}
02.html 如下:
{% extends "base.html" %} {% block title %} <p>02的标题</p> {% endblock title %} {% block content %} <p>02页面独有的内容</p> {% endblock content %}
-
模板中可以使用的变量和函数
1. config
你可以从模板中直接访问Flask当前的config对象:
{{config.SQLALCHEMY_DATABASE_URI}} sqlite:///database.db
2. request
就是flask中代表当前请求的request对象:
{{request.url}}
http://127.0.0.1
3. session
为Flask的session对象
{{session.new}}
True
4. g变量
在视图函数中设置g变量的 name 属性的值,然后在模板中直接可以取出
{{ g.name }}
5.url_for()
url_for会根据传入的路由器函数名,返回该路由对应的URL,在模板中始终使用url_for()就可以安全的修改路由绑定的URL,则不比担心模板中渲染出错的链接:
{{url_for('home')}}
/
如果我们定义的路由URL是带有参数的,则可以把它们作为关键字参数传入url_for(),Flask会把他们填充进最终生成的URL中:
{{ url_for('post', post_id=1)}}
/post/1
代码成就万世基积沙镇海,梦想永在凌云意意气风发。