1. 程式人生 > >Flask中的一些問題的初步彙總四

Flask中的一些問題的初步彙總四

Jinja2模板引擎簡介(template)
模板

檢視函式的主要作用是生成請求的響應,這是最簡單的請求。實際上,檢視函式有兩個作用:處理業務邏輯和返回響應內容。在大型應用中,把業務邏輯和表現內容放在一起,會增加程式碼的複雜度和維護成本。本節學到的模板,它的作用即是承擔檢視函式的另一個作用,即返回響應內容。

模板其實是一個包含響應文字的檔案,其中用佔位符(變數)表示動態部分,告訴模板引擎其具體的值需要從使用的資料中獲取
使用真實值替換變數,再返回最終得到的字串,這個過程稱為“渲染”
Flask是使用 Jinja2 這個模板引擎來渲染模板

使用模板的好處:

檢視函式只負責業務邏輯和資料處理(業務邏輯方面)
而模板則取到檢視函式的資料結果進行展示(檢視展示方面)
程式碼結構清晰,耦合度低

Jinja2
兩個概念:

Jinja2:是 Python 下一個被廣泛應用的模板引擎,是由Python實現的模板語言,他的設計思想來源於 Django 的模板引擎,並擴充套件了其語法和一系列強大的功能,其是Flask內建的模板語言。
模板語言:是一種被設計來自動生成文件的簡單文字格式,在模板語言中,一般都會把一些變數傳給模板,替換模板的特定位置上預先定義好的佔位變數名。

渲染模版函式

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

{{}} 來表示變數名,這種 {{}} 語法叫做變數程式碼塊

{{ post.title }}

Jinja2 模版中的變數程式碼塊可以是任意 Python 型別或者物件,只要它能夠被 Python 的 str() 方法轉換為一個字串就可以,比如,可以通過下面的方式顯示一個字典或者列表中的某個元素:

{{your_dict[‘key’]}}
{{your_list[0]}}

用 {%%} 定義的控制程式碼塊,可以實現一些語言層次的功能,比如迴圈或者if語句

{% if user %}
    {{ user }}
{% else %}
    hello!
<ul>
    {% for index in indexs %}
    <li> {{ index }} </li>
    {% endfor %}
</ul>

註釋

使用 {# #} 進行註釋,註釋的內容不會在html中被渲染出來

模板使用

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <meta http-equiv="X-UA-Compatible" content="ie=edge" />
    <title>flask網頁模板的學習</title>
  </head>
  <body>
    <center>
        <div>
            <!-- 雙中括弧是輸出。單中括弧是邏輯判斷  以後的註釋要用{#  #} -->
            這是我們第一個網頁模板 <br /><br />
            <!-- 這裡是註釋。最基本的模板語法輸出一個變數 -->
            <!-- {{ my_str + ", 前端頁面" }} <br /><br /> -->
            <!-- 模板語法可以做簡單的運算 -->
            {{ my_int + 10 }} <br /><br />
            <!-- list的操作,可以引用下表的方式輸出list元素 -->
            {{ my_list }}<br />
            {{ my_list[0] }}<br />
            {{ my_list.1 }}<br /><br />
            {# 這是模板的註釋方法 #} <br />
            {{ my_dict["name"] }} <br />
            {{ my_dict }} <br />
            {{ my_dict.age }} <br />
      
            {# 使用{% %} 來定義簡單的邏輯控制程式碼 #} 
            {% if my_int %} 
            整型存在 
            {% else %} 
            不存在 
            {# 使用if判斷。一定要有endif 用來結束邏輯判斷#} 
            {% endif %}
      
            <ul>
              {# 使用for迴圈來遍歷list #} 
              {% for item in my_list %}
                <li>{{ item }}</li>
              {# 使用for迴圈也要用endfor#} 
              {% endfor %}
            </ul>
            {# 使用if for 巢狀來實現單雙行背景色 #}
            <table style="border:1px solid black;padding: 5px;">
              {% for item in my_list %} 
                {% if loop.index % 2 == 0 %}
                <tr style="background-color:tomato">
                  <td>{{ item }}</td>
                </tr>
                {% else %}
                <tr style="background-color:violet">
                 <td>{{ item }}</td>
                </tr>
                {% endif %}
              {% endfor %}
            </table>
          </div>
    </center>
    
  </body>
</html>

過濾器
過濾器的本質就是函式。有時候我們不僅僅只是需要輸出變數的值,我們還需要修改變數的顯示,甚至格式化、運算等等,而在模板中是不能直接呼叫 Python 中的某些方法,那麼這就用到了過濾器。

鏈式呼叫
{{ “hello world” | reverse | upper }}

上程式碼:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>flask過濾器的學習</title>
</head>
<body>
    <center>
        1.<br />
        {# 過濾器呼叫方式 {{ 變數 | 過濾器的名稱 }} #}
        safe過濾器,可以禁用轉義
        {{ '<strong>hello</strong>' | safe }}
        <br />

        2.<br />
        系統預設的過濾器,把大寫字母轉換為小寫
        <br />
        {{ 'HELLO' | lower }}
        <br />

        3.<br />
        把小寫換為大寫
        <br />
        {{ 'hello' | upper }}
        <br />

        4.<br />
        經典。字串反轉
        <br />
        {{ '來一個反轉' | reverse }}
        <br />

        5.<br />
        首字母大寫。其餘字母小寫
        <br />
        {{ 'james' | capitalize }}
        <br />

        6.<br />
        過濾所有的html標籤,em標籤是斜體。跟轉義沒有任何關係,只是在過濾標籤,把所有文字中的標籤過濾掉
        <br />
        {{ '<em>hello</em>' | striptags }}
        <br />

        7.<br />
        只顯示list首個元素
        <br />
        {{ [100,99,65] | first }}
        <br />

        8.<br />
        只顯示最後一個元素
        <br />
        {{ [100,90,520] | last }}
        <br />

        9.<br />
        顯示一個list的長度
        <br />
        {{ [1,2] | length }}
        <br />

        10.<br />
        對list裡面的所有元素求和
        <br />
        {{ [100,200] | sum }}
        <br />

        11.<br />
        對list進行排序
        <br />
        {{ [12,3,4,56,7,89,8,76,5] | sort }}
        <br />

        12.<br />
        對語句塊兒進行過濾 (相當於文字,以換大寫為例)
        <br />
        {% filter upper %}
        hello world hello python hello flask hello filter hello csdn 
        {% endfilter %}
        <br />

        13.<br />
        鏈式呼叫(巢狀的使用過濾器)
        <br />
        {{'abcdefg' | reverse | upper }} 雙管道呼叫,先反轉。後大寫
        <br />
        {{'abcdefg' | upper | reverse }} 執行的順序。誰先誰後
        <br />
    </center>



</body>
</html>

程式碼複用
巨集 —- 類似python中的函式
建立:
{% macro 標籤名(key=value)%} {% end macro %}

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>flask中的巨集程式設計</title>
</head>
<body>
    
    減少重複的操作,定義一個巨集
    {% macro input(value,type,id) %} 也可用簡寫的標籤來代表input替換為i 也可以,下邊的input直接用i
    <input style="width:300px;" id="{{ id }}" type="{{ type }}" value="{{ value }}" />
    {% endmacro %}
    <br />

    呼叫巨集 傳參的時候要和上邊的引數要等同
    {{ input(type='text',value='使用者名稱',id="abc") }}
    <!-- 上邊的巨集等同於這裡的普通html標籤<input type="text" value="使用者名稱"> -->
    <br />
    {{ input(type='button',value='按鈕',id="abc") }}
    <br />
    {{ input(type='password',value='密碼', id="abc") }}
    
    
</body>
</html>

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