flask框架下的jinja2模板引擎(3)(模板继承与能够在模板使用的变量、方法)

flask 框架下的jinja2模块引擎(1):http://www.javashuo.com/article/p-hfvsbwpn-bm.htmlhtml

flask 框架下的jinja2模块引擎(2):http://www.javashuo.com/article/p-febuwrer-s.htmlpython

本文主要记录下 jinja2 的模板继承。sql

 

  • 模板继承是什么?

在模板中,可能会遇到如下状况:flask

  • 多个模板具备彻底相同的顶部和底部内容
  • 多个模板中具备相同的模板代码内容,可是内容中部分值不同
  • 多个模板中具备彻底相同的 html 代码块内容

像遇到这种状况,可使用 JinJa2 模板中的 继承 来进行实现安全

模板继承是为了重用模板中的公共内容。通常Web开发中,继承主要使用在网站的顶部菜单、底部。这些内容能够定义在父模板中,子模板直接继承,而不须要重复书写。session

  • 至关于在父模板中挖个坑,当子模板继承父模板时,能够进行填充。
  • 子模板使用 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 %} 的中间能够进行替换。而其余的内容能够继承。模板继承能够极大地提升开发效率。post

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
相关文章
相关标签/搜索