前言
-
根據(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)換為'<';
會(huì)轉(zhuǎn)換為'>';
' (單引號(hào)) 會(huì)轉(zhuǎn)換為''';
" (雙引號(hào))會(huì)轉(zhuǎn)換為 '"';
& 會(huì)轉(zhuǎn)換為 '&'; -
使用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ù),可以使用裝飾器csrf_exempt,模板中也不需要寫(xiě)標(biāo)簽,修改csrf2的視圖如下
-
保護(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ò)誤