四.模板之標(biāo)簽tag
在django中所有的標(biāo)簽均是通過{% %}來使用。
1.If...elif..else
成都創(chuàng)新互聯(lián)2013年至今,是專業(yè)互聯(lián)網(wǎng)技術(shù)服務(wù)公司,擁有項(xiàng)目網(wǎng)站制作、成都網(wǎng)站設(shè)計(jì)網(wǎng)站策劃,項(xiàng)目實(shí)施與項(xiàng)目整合能力。我們以讓每一個夢想脫穎而出為使命,1280元臺山做網(wǎng)站,已為上家服務(wù),為臺山各地企業(yè)和個人服務(wù),聯(lián)系電話:18982081108
{% if person.age > 20 %}
{% if person.age < 30 %}
<P>{{ person.name }}的年齡大于20小于30</P>
{% elif person.age < 40 %}
<P>{{ person.name }}的年齡小于40</P>
{% else %}
<P>{{ person.name }}的年齡大于等于40</P>
{% endif %}
{% elif person.age <= 20 and person.age > 10 %}
<P>{{ person.name }}的年齡大于10小于等于20</P>
{% else %}
<P>{{ person.name }}的年齡大于等于10</P>
{% endif %}
if必須要用{% endif%}來進(jìn)行結(jié)束,if同樣可以使用嵌套的用法。
2.for循環(huán)
{#for循環(huán)控制語句#}
<p>list類型的for循環(huán),{{ list1 }}</p>
{% for i in list1 %}
{# <p> {{ i }} </p> {# 此處遍歷得到的是元素 #}
{# <p> 第{{ forloop.counter }}個元素是:{{ i }}</p> {# forloop.counter默認(rèn)從1開始順序計(jì)數(shù) #}
{# <p> 第{{ forloop.counter0 }}個元素是:{{ i }}</p> {# forloop.counter0 是從0開始順序計(jì)數(shù) #}
{# <p> 倒數(shù)第{{ forloop.revcounter }}個元素是:{{ i }}</p> {# forloop.revcounter倒數(shù)進(jìn)行計(jì)數(shù),最小值默認(rèn)是1 #}
<p> 倒數(shù)第{{ forloop.revcounter0 }}個元素是:{{ i }}</p> {# forloop.revcounter0倒數(shù)進(jìn)行計(jì)數(shù),最小值默認(rèn)是0 #}
{# 注:不管是順序計(jì)數(shù)的forloop.counter或forloop.counter0還是逆序計(jì)數(shù)的forloop.revcounter或forloop.revcounter0;改變的只是計(jì)算的初始值而已#}
{% endfor %}
<hr>
<p>tuple類型的for循環(huán),{{ tuple1 }}</p>
{% for t in tuple1 %}
<p>第{{ forloop.counter }}個元素是:{{ t }}</p>
{% endfor %}
<hr>
<p>dict類型的for循環(huán),{{ data }}</p>
{% for t in data %}
<p>第{{ forloop.counter }}個字典的key值是:{{ t }}</p> {# 字典循環(huán)得到的是key #}
{% endfor %}
<hr>
<p>str類型的for循環(huán),{{ str1 }}</p>
{% for s in str1 %}
<p>第{{ forloop.counter }}個元素是:{{ s }}</p>
{% endfor %}
{# #}
<hr>
<p>forloop.first的用法,list2='{{ list2 }}'</p>
{% for s in list2 %}
{# {% if forloop.first %} {# forloop.first 結(jié)果返回布爾值 #}
{# <p>第1個元素不為False,它是:{{ s }}</p>#}
{# {% endif %}#}
{# <p>第{{ forloop.counter }}個元素是:{{ s }}</p>#}
{% empty %}
<p>第{{ forloop.counter }}個元素為空</p>
{% endfor %}
總結(jié):在django模板中的for循環(huán)語句和if條件判斷語句,都要用對應(yīng)的endfor和endif來作為結(jié)束的標(biāo)志。且,模板中的變量使用兩個括號{{ varname }}而模板中的標(biāo)簽語句時用一個括號和百分號組合進(jìn)行使用的{% tag語句 %}。
3.{% csrf_token %}
CSRF(Cross-site request forgery),中文名稱:跨站請求偽造,也被稱為:one click attack/session riding,縮寫為:CSRF/XSRF。
CSRF預(yù)防機(jī)制
CSRF的防御可以從服務(wù)端和客戶端兩方面著手,防御效果是從服務(wù)端著手效果比較好,現(xiàn)在一般的CSRF防御也都在服務(wù)端進(jìn)行。
token防御的整體思路是:
第1步:后端隨機(jī)產(chǎn)生一個token,把這個token保存在SESSION狀態(tài)中;同時,后端把這個token交給前端頁面;
第2步:下次前端需要發(fā)起請求(比如發(fā)帖)的時候把這個token加入到請求數(shù)據(jù)或者頭信息中,一起傳給后端;
第3步:后端校驗(yàn)前端請求帶過來的token和SESSION里的token是否一致;
Django下的CSRF預(yù)防機(jī)制
django 第一次響應(yīng)來自某個客戶端的請求時,會在服務(wù)器端隨機(jī)生成一個 token,把這個 token 放在 cookie 里。然后每次 POST 請求都會帶上這個 token,
這樣就能避免被 CSRF ***。
在 templete 中, 為每個 POST form 增加一個 {% csrf_token %} tag. 如下:
1.在返回的 HTTP 響應(yīng)的 cookie 里,django 會為你添加一個 csrftoken 字段,其值為一個自動生成的 token
2.在所有的 POST 表單模板中,加一個{% csrf_token %} 標(biāo)簽,它的功能其實(shí)是給form增加一個隱藏的input標(biāo)簽,如下
<input type="hidden" name="csrfmiddlewaretoken" value="{{ csrf_token }}">,而這個csrf_token = cookie.csrftoken,在渲染模板時context中有context['csrf_token']=request.COOKIES['csrftoken']
3.在通過表單發(fā)送POST到服務(wù)器時,表單中包含了上面隱藏了crsrmiddlewaretoken這個input項(xiàng),服務(wù)端收到后,django 會驗(yàn)證這個請求的 cookie 里的 csrftoken 字段的值和提交的表單里的 csrfmiddlewaretoken 字段的值是否一樣。如果一樣,則表明這是一個合法的請求,否則,這個請求可能是來自于別人的 csrf ***,返回 403 Forbidden.
4.在通過 ajax 發(fā)送POST請求到服務(wù)器時,要求增加一個x-csrftoken header,其值為 cookie 里的 csrftoken 的值,服務(wù)湍收到后,django會驗(yàn)證這個請求的cookie里的csrftoken字段與ajax post消息頭中的x-csrftoken header是否相同,如果相同,則表明是一個合法的請求
django為用戶實(shí)現(xiàn)防止跨站請求偽造的功能,通過中間件 django.middleware.csrf.CsrfViewMiddleware 來完成。而對于django中設(shè)置防跨站請求偽造功能有分為全局和局部。
全局:
中間件 django.middleware.csrf.CsrfViewMiddleware
局部:
?@csrf_protect,為當(dāng)前函數(shù)強(qiáng)制設(shè)置防跨站請求偽造功能,即便settings中沒有設(shè)置全局中間件。
?@csrf_exempt,取消當(dāng)前函數(shù)防跨站請求偽造功能,即便settings中設(shè)置了全局中間件。
注:from django.views.decorators.csrf import csrf_exempt,csrf_protect
1、原理
在客戶端頁面上添加csrftoken, 服務(wù)器端進(jìn)行驗(yàn)證,服務(wù)器端驗(yàn)證的工作通過'django.middleware.csrf.CsrfViewMiddleware'這個中間層來完成。在django當(dāng)中防御csrf***的方式有兩種:
1.在表單當(dāng)中附加csrftoken
2.通過request請求中添加X-CSRFToken請求頭。
注意:Django默認(rèn)對所有的POST請求都進(jìn)行csrftoken驗(yàn)證,若驗(yàn)證失敗則403錯誤侍候。
如下圖,前端不帶csrf_token時:
下圖開始帶csrf_token:
4.{% url '引用的url地址' %}
主要是在進(jìn)行url別名時的使用,先在url中為該url設(shè)置別名,這樣其他地方需要引用該地址時就可以直接使用別名即可。如圖:
5.{% with %}
with是將變量進(jìn)行重命名(主要是將view中直接傳來的復(fù)雜變量名進(jìn)行簡寫,只能是view中現(xiàn)有的變量,不能是再進(jìn)一步獲取的變量.例如該例子中可以是view中的person,卻不能是person.name。且必須要以{% endwith %}作為結(jié)束。
注意:with中進(jìn)行變量賦值時,等號前后不能有空格,否則將報(bào)錯不是一個變量。
6.{% verbatim %}
作用:禁止render在前端瀏覽器渲染該部分的變量,類似于轉(zhuǎn)義符’//’表示/一樣的作用。{%verbatim%}也必須以{% endverbatim%}來作為結(jié)束。
如圖,需要在瀏覽器上顯示{{data}},而不是渲染出view中data變量值:
7.自定義標(biāo)簽
自定義標(biāo)簽的新建步驟參考自定義過濾器的步驟https://blog.51cto.com/10836356/2318602;
自定義標(biāo)簽和上一節(jié)中的自定義過濾器的定義方法完全相同,只是自定義標(biāo)簽的上方的裝飾器不同而已。
自定義標(biāo)簽和自定義過濾器的區(qū)別:
A.自定義過濾器函數(shù)中只能定義一個變量(加上自身共2個變量),而自定義標(biāo)簽函數(shù)的變量個數(shù)可以任意多;
B.自定義過濾器是作用于變量的,所以在使用時一定是在{{a|filter}}中且與作用對象用’|’隔開;而自定義標(biāo)簽是使用在{% tagname pram1 pram2 ...%}
C.自定義標(biāo)簽局限性:不能用在if等tag語句中,而filter可以用在if等tag語句中,如圖:
如下圖所示,可以比較兩者的使用方法和效果:
分享文章:Django4.2_templates之各種標(biāo)簽的用法講解
網(wǎng)站路徑:http://jinyejixie.com/article12/ijcegc.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供ChatGPT、虛擬主機(jī)、動態(tài)網(wǎng)站、響應(yīng)式網(wǎng)站、全網(wǎng)營銷推廣、網(wǎng)站導(dǎo)航
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)