Django模板template

前言

  • 根據(jù)前篇Django模型model分享,接著本篇文章分享下Django模板template,本篇內(nèi)容包括:

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

    • 模板變量 {{ variable }}

      • 變量名必須由字母、數(shù)字、下劃線(不能以下劃線開(kāi)頭)和點(diǎn)組成
      • 當(dāng)模版引擎遇到一個(gè)變量,將計(jì)算這個(gè)變量,然后將結(jié)果輸出
      • 如果變量不存在, 模版系統(tǒng)將插入'' (空字符串)
    • 模板標(biāo)簽 { % 代碼塊 % }

      • 控制循環(huán)或邏輯
      • 加載外部信息到本模板中使用

      { % for test1 in array %}
      循環(huán)邏輯
      {{forloop.counter}}表示當(dāng)前是第幾次循環(huán)
      { %empty%}
      給出的列表不存在時(shí),執(zhí)行此處邏輯
      { %endfor%}

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

      include:加載模板并以標(biāo)簽內(nèi)的參數(shù)渲染
      { %include "foo/bar.html" % }

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

      csrf_token:這個(gè)標(biāo)簽用于跨站請(qǐng)求偽造保護(hù)
      { % csrf_token %}

      布爾標(biāo)簽:and、or,and比or的優(yōu)先級(jí)高

    • 模板過(guò)濾器

    • 模板注釋

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

      {# 代碼或html #} 單行注釋

  • 當(dāng)模版引擎遇到點(diǎn)("."),會(huì)按照下列順序查詢(xún):

    • 字典查詢(xún),例如:foo["name"]
    • 屬性或方法查詢(xún),例如:foo.name
    • 數(shù)字索引查詢(xún),例如:foo[name]
  • 在模板中調(diào)用方法時(shí)不能傳遞參數(shù)

    {{test.showTitle}},test是模型類(lèi)對(duì)象調(diào)用模型類(lèi)中showTitle方法,此時(shí)不能傳遞參數(shù)

  • 模板過(guò)濾器

    • 語(yǔ)法:{ { 變量|過(guò)濾器 }},使用管道符號(hào) (|)來(lái)應(yīng)用過(guò)濾器

    • 可以在if、for等標(biāo)簽中使用過(guò)濾器結(jié)合運(yùn)算符

      if list|length > 1

    • 過(guò)濾器能夠“串聯(lián)”使用,構(gòu)成過(guò)濾器鏈

      title|lower|upper

    • 過(guò)濾器可以傳遞參數(shù),參數(shù)使用引號(hào)包起來(lái)

      array|join:", "

    • default:如果一個(gè)變量沒(méi)有被提供,或者值為false或空,則使用默認(rèn)值,否則使用變量的值

      value|default:"什么也沒(méi)有"

    • date:根據(jù)給定格式對(duì)一個(gè)date變量格式化

      value|date:'Y-m-d'

2. 模板的繼承
  • 模板繼承可以減少頁(yè)面內(nèi)容的重復(fù)定義,實(shí)現(xiàn)頁(yè)面內(nèi)容的重用

  • 模板繼承所用的模板標(biāo)簽block,在父模板中定義預(yù)留區(qū)域

    { %block 標(biāo)示名%}

    可以定義默認(rèn)值
    如果不定義默認(rèn)值,則表示空字符串
    { %endblock 標(biāo)示名%}

  • 子模板繼承父模板,寫(xiě)在模板最前面

    { % extends "base.html" %}

  • 在子模板中使用block填充預(yù)留區(qū)域

    { %block 標(biāo)示名%}
    需要填充的內(nèi)容
    { %endblock 標(biāo)示名%}

3. HTML轉(zhuǎn)義
  • html轉(zhuǎn)義,就是將包含的html標(biāo)簽輸出,而不被解釋執(zhí)行

  • Django會(huì)將如下字符自動(dòng)轉(zhuǎn)義:

    < 會(huì)轉(zhuǎn)換為'&lt';
    會(huì)轉(zhuǎn)換為'&gt';
    ' (單引號(hào)) 會(huì)轉(zhuǎn)換為'&#39';
    " (雙引號(hào))會(huì)轉(zhuǎn)換為 '&quot';
    & 會(huì)轉(zhuǎn)換為 '&amp';

  • 使用escape過(guò)濾器

    {{t1|escape}}

  • 關(guān)閉轉(zhuǎn)義

    • 對(duì)于變量使用safe過(guò)濾器

      {{ data|safe }}

    • 對(duì)于代碼塊使用autoescape標(biāo)簽,標(biāo)簽autoescape接受on或者off參數(shù),自動(dòng)轉(zhuǎn)義標(biāo)簽在base模板中關(guān)閉,在child模板中也是關(guān)閉的

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

  • 手動(dòng)轉(zhuǎn)義

    { { data|default:"<b>123456</b>" }}

4. CSRF:跨站請(qǐng)求偽造
  • 某些惡意網(wǎng)站上包含鏈接、表單按鈕或者JavaScript,它們會(huì)利用登錄過(guò)的用戶(hù)在瀏覽器中的認(rèn)證信息試圖在你的網(wǎng)站上完成某些操作,這就是跨站攻擊

  • 創(chuàng)建視圖csrf1用于展示表單,csrf2用于接收post請(qǐng)求

  • 防csrf的使用

    • 將settings.py中的中間件代碼'django.middleware.csrf.CsrfViewMiddleware'注釋
    • 在csrf1.html中添加標(biāo)簽

      {% csrf_token %}

  • 取消保護(hù)

    • 如果某些視圖不需要保護(hù),可以使用裝飾器csrf_exempt,模板中也不需要寫(xiě)標(biāo)簽,修改csrf2的視圖如下

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

  • 保護(hù)機(jī)制

    <input type='hidden' name='csrfmiddlewaretoken' value='nGjAB3Md9ZSb4NmG1sXDolPmh3bR2g59' />

  • 在瀏覽器的調(diào)試工具中,通過(guò)network標(biāo)簽可以查看cookie信息

  • 當(dāng)提交請(qǐng)求時(shí),中間件'django.middleware.csrf.CsrfViewMiddleware'會(huì)對(duì)提交的cookie及隱藏域的內(nèi)容進(jìn)行驗(yàn)證,如果失敗則返回403錯(cuò)誤

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容