Django模板template

JCSON就是我發表於2017-11-13

前言

  • 根據前篇Django模型model分享,接著本篇文章分享下Django模板template,本篇內容包括:

    • 模板的定義
    • 模板的繼承
    • HTML轉義
    • CSRF
1. 模板的定義
  • 模板定義之前首先了解下模板語法,主要包括:

    • 模板變數 {{ variable }}
      • 變數名必須由字母、數字、下劃線(不能以下劃線開頭)和點組成
      • 當模版引擎遇到一個變數,將計算這個變數,然後將結果輸出
      • 如果變數不存在, 模版系統將插入'' (空字串)
    • 模板標籤 { % 程式碼塊 % }

      • 控制迴圈或邏輯
      • 載入外部資訊到本模板中使用

        { % for test1 in array %}
        迴圈邏輯
        {{forloop.counter}}表示當前是第幾次迴圈
        { %empty%}
        給出的列表不存在時,執行此處邏輯
        { %endfor%}

        { %if ...%}
        邏輯1
        { %elif ...%}
        邏輯2
        { %else%}
        邏輯3
        { %endif%}

      include:載入模板並以標籤內的引數渲染
      { %include "foo/bar.html" % }

      url:反向解析
      { % url 'namespace:name' pagram1 pagram2 %}

      csrf_token:這個標籤用於跨站請求偽造保護
      { % csrf_token %}

      布林標籤:and、or,and比or的優先順序高

    • 模板過濾器
    • 模板註釋

      { % comment % }
      多行註釋
      { % endcomment % }

      {# 程式碼或html #} 單行註釋

  • 當模版引擎遇到點("."),會按照下列順序查詢:

    • 字典查詢,例如:foo["name"]
    • 屬性或方法查詢,例如:foo.name
    • 數字索引查詢,例如:foo[name]
  • 在模板中呼叫方法時不能傳遞引數

    {{test.showTitle}},test是模型類物件呼叫模型類中showTitle方法,此時不能傳遞引數

  • 模板過濾器

    • 語法:{ { 變數|過濾器 }},使用管道符號 (|)來應用過濾器
    • 可以在if、for等標籤中使用過濾器結合運算子

      if list|length > 1

    • 過濾器能夠“串聯”使用,構成過濾器鏈

      title|lower|upper

    • 過濾器可以傳遞引數,引數使用引號包起來

      array|join:", "

    • default:如果一個變數沒有被提供,或者值為false或空,則使用預設值,否則使用變數的值

      value|default:"什麼也沒有"

    • date:根據給定格式對一個date變數格式化

      value|date:'Y-m-d'

2. 模板的繼承
  • 模板繼承可以減少頁面內容的重複定義,實現頁面內容的重用
  • 模板繼承所用的模板標籤block,在父模板中定義預留區域

    { %block 標示名%}
    可以定義預設值
    如果不定義預設值,則表示空字串
    { %endblock 標示名%}

  • 子模板繼承父模板,寫在模板最前面

    { % extends "base.html" %}

  • 在子模板中使用block填充預留區域

    { %block 標示名%}
    需要填充的內容
    { %endblock 標示名%}

3. HTML轉義
  • html轉義,就是將包含的html標籤輸出,而不被解釋執行

  • Django會將如下字元自動轉義:

    < 會轉換為'&lt';
    會轉換為'&gt';
    ' (單引號) 會轉換為'&#39';
    " (雙引號)會轉換為 '&quot';
    & 會轉換為 '&amp';

  • 使用escape過濾器

    {{t1|escape}}

  • 關閉轉義

    • 對於變數使用safe過濾器

      {{ data|safe }}

      • 對於程式碼塊使用autoescape標籤,標籤autoescape接受on或者off引數,自動轉義標籤在base模板中關閉,在child模板中也是關閉的

        { % autoescape off %}
        {{ body }}
        { % endautoescape %}

  • 手動轉義

    { { data|default:"123456" }}

4. CSRF:跨站請求偽造
  • 某些惡意網站上包含連結、表單按鈕或者JavaScript,它們會利用登入過的使用者在瀏覽器中的認證資訊試圖在你的網站上完成某些操作,這就是跨站攻擊
  • 建立檢視csrf1用於展示表單,csrf2用於接收post請求

  • 防csrf的使用

    • 將settings.py中的中介軟體程式碼'django.middleware.csrf.CsrfViewMiddleware'註釋
      • 在csrf1.html中新增標籤

        {% csrf_token %}

  • 取消保護

    • 如果某些檢視不需要保護,可以使用裝飾器csrf_exempt,模板中也不需要寫標籤,修改csrf2的檢視如下

      from django.views.decorators.csrf import csrf_exempt
      @csrf_exempt
      def csrf2(request):
      pass

  • 保護機制

  • 在瀏覽器的除錯工具中,通過network標籤可以檢視cookie資訊

  • 當提交請求時,中介軟體'django.middleware.csrf.CsrfViewMiddleware'會對提交的cookie及隱藏域的內容進行驗證,如果失敗則返回403錯誤

相關文章