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
相關文章
相關標籤/搜索