Web框架——Flask系列之宏、繼承、包含(十八)

一、宏

類似於python中的函數,宏的作用就是在模板中重複利用代碼,避免代碼冗餘。

Jinja2支持宏,還可以導入宏,需要在多處重複使用的模板代碼片段可以寫入單獨的文件,再包含在所有模板中,以避免重複。

  1. 定義宏
{% macro input() %}
  <input type="text"
         name="username"
         value=""
         size="30"/>
{% endmacro %}
  1. 調用宏
{{ input() }}
  1. 定義帶參數的宏
{% macro input(name,value='',type='text',size=20) %}
    <input type="{{ type }}"
           name="{{ name }}"
           value="{{ value }}"
           size="{{ size }}"/>
{% endmacro %}
  1. 調用宏,並傳遞參數
{{ input(value='name',type='password',size=40)}}

在這裏插入圖片描述
5. 把宏單獨抽取出來,封裝成html文件,其它模板中導入使用
文件名可以自定義macro.html:

{% macro function() %}

    <input type="text" name="username" placeholde="Username">
    <input type="password" name="password" placeholde="Password">
    <input type="submit">
{% endmacro %}

在其它模板文件中先導入,再調用

{% import 'macro.html' as func %}
{{ func.function() }}

在這裏插入圖片描述
在這裏插入圖片描述

二、模板繼承

模板繼承是爲了重用模板中的公共內容。一般Web開發中,繼承主要使用在網站的頂部菜單、底部。這些內容可以定義在父模板中,子模板直接繼承,而不需要重複書寫。

{% block top %}``{% endblock %}標籤定義的內容,相當於在父模板中挖個坑,當子模板繼承父模板時,可以進行填充。

子模板使用extends指令聲明這個模板繼承自哪?父模板中定義的塊在子模板中被重新定義,在子模板中調用父模板的內容可以使用super()。

  1. 父模板:base.html
{% block top %}
    頂部菜單
  {% endblock top %}

  {% block content %}
  {% endblock content %}

  {% block bottom %}
    底部
  {% endblock bottom %}
  1. 子模板:
  {% extends 'base.html' %}
  {% block content %}
   需要填充的內容
  {% endblock content %}

模板繼承使用時注意點

  1. 不支持多繼承。
  2. 爲了便於閱讀,在子模板中使用extends時,儘量寫在模板的第一行。
  3. 不能在一個模板文件中定義多個相同名字的block標籤
  4. 當在頁面中使用多個block標籤時,建議給結束標籤起個名字,當多個block嵌套時,閱讀性更好。

三、包含

Jinja2模板中,除了宏和繼承,還支持一種代碼重用的功能,叫包含(Include)。它的功能是將另一個模板整個加載到當前模板中,並直接渲染

示例:

include的使用

{% include 'hello.html' %}

包含在使用時,如果包含的模板文件不存在時,程序會拋出TemplateNotFound異常,可以加上ignore missing關鍵字。如果包含的模板文件不存在,會忽略這條include語句。

示例:

include的使用加上關鍵字ignore missing

{% include 'hello.html' ignore missing %}

四、總結宏、繼承、包含:

  1. 宏(Macro)、繼承(Block)、包含(include)均能實現代碼的複用
  2. 繼承(Block)的本質是代碼替換,一般用來實現多個頁面中重複不變的區域。
  3. 宏(Macro)的功能類似函數,可以傳入參數,需要定義、調用。
  4. 包含(include)是直接將目標模板文件整個渲染出來
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章