1. 程式人生 > >flask 模板Template

flask 模板Template

flask 模板

  • 檢視函式主要作用是生成請求的響應,包含兩個作用:處理業務邏輯和返回響應內容。
  • 模板作用:承擔在大型專案內的返回響應內容的作用。
  • 模板其實是一個包含響應文字的檔案,其中用佔位符(變數)表示動態部分,告訴模板引擎其具體的值需要從使用的資料中獲取
    使用真實值替換變數,再返回最終得到的字串,這個過程稱為“渲染”
    Flask是使用 Jinja2 這個模板引擎來渲染模板

1 jinja2簡介

1 Flask內建的模板語言;2 模板語言是一種被設計來自動生成文件的簡單文字格式,在模板語言中,一般都會把一些變數傳給模板,替換模板的特定位置上預先定義好的佔位變數名。

使用:
變數程式碼塊:{{}}
   <h1>{{ post.title }}</h1>
控制程式碼塊:{% %}
   實現語言層次的一些功能,語句控制輸出。
if語句:

   {% if 判別條件 %}
   語句1
   {% elif 判別條件 %}
   語句2
   {% endif %}

for 語句:

    {% for data in data_list %}
    迴圈語句
    {% endfor %}

註釋語句:
   {{# #}}

render_template

Flask提供render_template函式封裝模板引擎。
render_template 函式的第一個引數是模板的檔名,後面的引數都是鍵值對,表示模板中變數。

    @app.route('/')
    def index():
    data = "itpycharm"
        return render_template('temp_demo1.html',data=data)

2 模板的使用

專案下建立 templates 資料夾,其內放置所有模板檔案。
pycharm可以設定templates 資料夾屬性(mark)以便能夠在程式碼中有智慧提示。
設定 html 中的模板語言Templates,以便在 html 有智慧提示

3 過濾器

過濾器的本質就是函式。
過濾器:對字串的處理,格式化輸出資料。預設開啟轉義,會把變數的標籤使用字串形式顯示。基於模板函式render_template。
語法格式:{{變數 | 過濾器}}
支援鏈式呼叫。
<p>反轉首字母大寫:{{ 'ANiHc FO KnAb' | reverse | capitalize }}</p>


字串操作:
safe:禁用轉義,開始解析標籤字串。
   {{ '<em>hello world</em>' | safe }}</p>
reverse:翻轉,原字串進行反序輸出
upper:大寫,原字串全部大寫。
lower:小寫,原字串全部小寫
title:把值中的每個單詞的首字母都轉成大寫
capitalize:首字元大寫。
format:格式化輸出;
列表操作:
   last first sum length sort(排序)
format:格式化輸出
   <p>{{ '%s is %d' | format('name',17) }}</p>
striptags:渲染之前把值中所有的HTML標籤都刪掉
   <p>{{ '<em>hello</em>' | striptags }}</p>

語句塊過濾:

    {% filter upper %}
        #一大堆文字#
    {% endfilter %}

3.1 自定義過濾器

自定義過濾器有兩種實現方式:

注意:自定義的過濾器名稱如果和內建的過濾器重名,會覆蓋內建的過濾器。

方式一,add_template_filter 方法

通過呼叫Flask應用物件的 add_template_filter 方法實現自定義過濾器。

    def do_listreverse(li):
        # 通過原列表建立一個新列表
        temp_li = list(li)
        # 將新列表進行返轉
        temp_li.reverse()
        return temp_li
    app.add_template_filter(do_listreverse,'lireverse')

該方法第一個引數是函式名,第二個引數是自定義的過濾器名稱:

方式二,通過裝飾器來實現自定義過濾器

裝飾器傳入的引數是自定義的過濾器名稱。

    @app.template_filter('lireverse')
    def do_listreverse(li):
        # 通過原列表建立一個新列表
        temp_li = list(li)
        # 將新列表進行返轉
        temp_li.reverse()
        return temp_li

在 html 中使用自定義過濾器

    <br/> my_array 原內容:{{ my_array }}
    <br/> my_array 反轉:{{ my_array | lireverse }}

1.1 控制程式碼塊

if 程式碼塊、for程式碼塊
在一個 for 迴圈塊中你可以使用loop特殊的變數訪問一些資訊:
變數 描述

loop.index 當前迴圈迭代的次數(從 1 開始)
loop.index0 當前迴圈迭代的次數(從 0 開始)
loop.revindex 到迴圈結束需要迭代的次數(從 1 開始)
loop.revindex0 到迴圈結束需要迭代的次數(從 0 開始)
loop.first 如果是第一次迭代,為 True 。
loop.last 如果是最後一次迭代,為 True 。
loop.length 序列中的專案數。
loop.cycle 在一串序列間期取值的輔助函式。

4 模板程式碼複用

使用 JinJa2 模板中的 巨集、繼承、包含方法實現減少多個模板中程式碼的重複。

模板巨集

對巨集(macro)的理解:

  • 類似Jinja2 中的一個函式,它會返回一段HTML模板程式碼。
  • 巨集可以寫在一個單獨檔案內,再讓多個模板進行呼叫。
    使用
  • 定義巨集
    {% macro input(name,value='',type='text') %}
        <input type="{{type}}" name="{{name}}"
            value="{{value}}" class="form-control">
    {% endmacro %}
  • 呼叫巨集
    {{ input('name' value='hello Python')}}
  • 輸出
	<input type="text" name="name"
    value="hello Python" class="form-control">

抽取巨集HTML檔案

  • 把巨集單獨抽取出來,封裝成html檔案,檔名可以自定義macro.html
    {% macro function(type='text', name='', value='') %}
    <input type="{{type}}" name="{{name}}"
    value="{{value}}" >
    {% endmacro %}
  • 在其它模板檔案中先匯入,再呼叫
    {% import 'macro.html' as macr %}
    {% macr.function() %}

模板繼承

模板繼承可以多次使用重複的內容。
一般繼承主要使用在網站的頂部選單、底部。
父模板定義block 內容,子模板直接繼承使用。
定義格式:

    {% block top %} 
    標籤定義的內容 
    {% endblock %}
  • 子模板使用 extends 指令宣告這個模板繼承自哪個模板
  • 父模板中定義的塊在子模板中被重新定義,在子模板中呼叫父模板的內容可以使用super()
    父模板base.html
    {% block top %}
      頂部選單
    {% endblock top %}

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

    {% block bottom %}
      底部
    {% endblock bottom %}

子模板
extends指令宣告這個模板繼承自哪

    {% extends 'base.html' %}
    {% block content %}
     子模板需要填充的內容
    {% endblock content %}
  • 模板繼承使用時注意點:
    • 不支援多繼承
    • 子模板第一行書寫extends,便於閱讀。
    • 同一模板檔案,block名字不能重複
    • 當在頁面中使用多個block標籤時,建議給結束標籤起個名字,當多個block巢狀時,閱讀性更好。

模板包含

Jinja2模板中,包含(Include)方法。
將另一個模板整個載入到當前模板中,並直接渲染。
Include的使用:
   {% include 'hello.html' %}

包含在使用時,如果包含的模板檔案不存在時,程式會丟擲TemplateNotFound異常。加上 ignore missing 關鍵字,如果包含的模板檔案不存在,會忽略這條include語句。
Include 加上關鍵字ignore missing:
   {% include 'hello.html' ignore missing %}

小結
巨集(Macro)、繼承(Block)、包含(include)均能實現程式碼的複用。
繼承(Block)的本質是程式碼替換,一般用來實現多個頁面中重複不變的區域。
巨集(Macro)的功能類似函式,可以傳入引數,需要定義、呼叫。
包含(include)是直接將目標模板檔案整個渲染出來。

模板特有變數和函式

Flask 預設內建模板的函式和物件。

config

你可以從模板中直接訪問Flask當前的config物件;
配置資料庫:

    {{config.SQLALCHEMY_DATABASE_URI}}
    mysql://root:mysql/database

request

就是flask中代表當前請求的request物件:

    {{request.url}}
    http://127.0.0.1

session

為Flask的session物件

    {{session.new}}
    True

g變數

在檢視函式中設定g變數的 name 屬性的值,然後在模板中直接可以取出
{{ g.name }}

url_for()

url_for會根據傳入的路由器函式名,返回該路由對應的URL,在模板中始終使用url_for()就可以安全的修改路由繫結的URL,則不比擔心模板中渲染出錯的連結:

    {{url_for('home')}}
    /

如果我們定義的路由URL是帶有引數的,則可以把它們作為關鍵字引數傳入url_for(),Flask會把他們填充進最終生成的URL中:

    {{ url_for('post', post_id=1)}}
    /post/1

get_flashed_messages()

這個函式會返回之前在flask中通過flask()傳入的訊息的列表,flash函式的作用很簡單,可以把由Python字串表示的訊息加入一個訊息佇列中,再使用get_flashed_message()函式取出它們並消費掉:

    {%for message in get_flashed_messages()%}
        {{message}}
    {%endfor%}