四.模板之標籤tag
在django中全部的標籤均是經過{% %}來使用。
1.If...elif..else前端
{% 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%}來進行結束,if一樣可使用嵌套的用法。
2.for循環ajax
{#for循環控制語句#} <p>list類型的for循環,{{ list1 }}</p> {% for i in list1 %} {# <p> {{ i }} </p> {# 此處遍歷獲得的是元素 #} {# <p> 第{{ forloop.counter }}個元素是:{{ i }}</p> {# forloop.counter默認從1開始順序計數 #} {# <p> 第{{ forloop.counter0 }}個元素是:{{ i }}</p> {# forloop.counter0 是從0開始順序計數 #} {# <p> 倒數第{{ forloop.revcounter }}個元素是:{{ i }}</p> {# forloop.revcounter倒數進行計數,最小值默認是1 #} <p> 倒數第{{ forloop.revcounter0 }}個元素是:{{ i }}</p> {# forloop.revcounter0倒數進行計數,最小值默認是0 #} {# 注:不論是順序計數的forloop.counter或forloop.counter0仍是逆序計數的forloop.revcounter或forloop.revcounter0;改變的只是計算的初始值而已#} {% endfor %} <hr> <p>tuple類型的for循環,{{ tuple1 }}</p> {% for t in tuple1 %} <p>第{{ forloop.counter }}個元素是:{{ t }}</p> {% endfor %} <hr> <p>dict類型的for循環,{{ data }}</p> {% for t in data %} <p>第{{ forloop.counter }}個字典的key值是:{{ t }}</p> {# 字典循環獲得的是key #} {% endfor %} <hr> <p>str類型的for循環,{{ 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 結果返回布爾值 #} {# <p>第1個元素不爲False,它是:{{ s }}</p>#} {# {% endif %}#} {# <p>第{{ forloop.counter }}個元素是:{{ s }}</p>#} {% empty %} <p>第{{ forloop.counter }}個元素爲空</p> {% endfor %}
總結:在django模板中的for循環語句和if條件判斷語句,都要用對應的endfor和endif來做爲結束的標誌。且,模板中的變量使用兩個括號{{ varname }}而模板中的標籤語句時用一個括號和百分號組合進行使用的{% tag語句 %}。django
3.{% csrf_token %}
CSRF(Cross-site request forgery),中文名稱:跨站請求僞造,也被稱爲:one click attack/session riding,縮寫爲:CSRF/XSRF。後端
CSRF預防機制 CSRF的防護能夠從服務端和客戶端兩方面着手,防護效果是從服務端着手效果比較好,如今通常的CSRF防護也都在服務端進行。 token防護的總體思路是: 第1步:後端隨機產生一個token,把這個token保存在SESSION狀態中;同時,後端把這個token交給前端頁面; 第2步:下次前端須要發起請求(好比發帖)的時候把這個token加入到請求數據或者頭信息中,一塊兒傳給後端; 第3步:後端校驗前端請求帶過來的token和SESSION裏的token是否一致; Django下的CSRF預防機制 django 第一次響應來自某個客戶端的請求時,會在服務器端隨機生成一個 token,把這個 token 放在 cookie 裏。而後每次 POST 請求都會帶上這個 token, 這樣就能避免被 CSRF ***。 在 templete 中, 爲每一個 POST form 增長一個 {% csrf_token %} tag. 以下: 1.在返回的 HTTP 響應的 cookie 裏,django 會爲你添加一個 csrftoken 字段,其值爲一個自動生成的 token 2.在全部的 POST 表單模板中,加一個{% csrf_token %} 標籤,它的功能實際上是給form增長一個隱藏的input標籤,以下 <input type="hidden" name="csrfmiddlewaretoken" value="{{ csrf_token }}">,而這個csrf_token = cookie.csrftoken,在渲染模板時context中有context['csrf_token']=request.COOKIES['csrftoken'] 3.在經過表單發送POST到服務器時,表單中包含了上面隱藏了crsrmiddlewaretoken這個input項,服務端收到後,django 會驗證這個請求的 cookie 裏的 csrftoken 字段的值和提交的表單裏的 csrfmiddlewaretoken 字段的值是否同樣。若是同樣,則代表這是一個合法的請求,不然,這個請求多是來自於別人的 csrf ***,返回 403 Forbidden. 4.在經過 ajax 發送POST請求到服務器時,要求增長一個x-csrftoken header,其值爲 cookie 裏的 csrftoken 的值,服務湍收到後,django會驗證這個請求的cookie裏的csrftoken字段與ajax post消息頭中的x-csrftoken header是否相同,若是相同,則代表是一個合法的請求 django爲用戶實現防止跨站請求僞造的功能,經過中間件 django.middleware.csrf.CsrfViewMiddleware 來完成。而對於django中設置防跨站請求僞造功能有分爲全局和局部。 全局: 中間件 django.middleware.csrf.CsrfViewMiddleware 局部: @csrf_protect,爲當前函數強制設置防跨站請求僞造功能,即使settings中沒有設置全局中間件。 @csrf_exempt,取消當前函數防跨站請求僞造功能,即使settings中設置了全局中間件。 注:from django.views.decorators.csrf import csrf_exempt,csrf_protect 一、原理 在客戶端頁面上添加csrftoken, 服務器端進行驗證,服務器端驗證的工做經過'django.middleware.csrf.CsrfViewMiddleware'這個中間層來完成。在django當中防護csrf***的方式有兩種: 1.在表單當中附加csrftoken 2.經過request請求中添加X-CSRFToken請求頭。 注意:Django默認對全部的POST請求都進行csrftoken驗證,若驗證失敗則403錯誤侍候。
以下圖,前端不帶csrf_token時:
瀏覽器
下圖開始帶csrf_token:
4.{% url '引用的url地址' %}
主要是在進行url別名時的使用,先在url中爲該url設置別名,這樣其餘地方須要引用該地址時就能夠直接使用別名便可。如圖:
服務器
5.{% with %}
with是將變量進行重命名(主要是將view中直接傳來的複雜變量名進行簡寫,只能是view中現有的變量,不能是再進一步獲取的變量.例如該例子中能夠是view中的person,卻不能是person.name。且必需要以{% endwith %}做爲結束。
注意:with中進行變量賦值時,等號先後不能有空格,不然將報錯不是一個變量。
6.{% verbatim %}
做用:禁止render在前端瀏覽器渲染該部分的變量,相似於轉義符’//’表示/同樣的做用。{%verbatim%}也必須以{% endverbatim%}來做爲結束。
如圖,須要在瀏覽器上顯示{{data}},而不是渲染出view中data變量值:
7.自定義標籤
自定義標籤的新建步驟參考自定義過濾器的步驟https://blog.51cto.com/10836356/2318602;
自定義標籤和上一節中的自定義過濾器的定義方法徹底相同,只是自定義標籤的上方的裝飾器不一樣而已。
自定義標籤和自定義過濾器的區別:
A.自定義過濾器函數中只能定義一個變量(加上自身共2個變量),而自定義標籤函數的變量個數能夠任意多;
B.自定義過濾器是做用於變量的,因此在使用時必定是在{{a|filter}}中且與做用對象用’|’隔開;而自定義標籤是使用在{% tagname pram1 pram2 ...%}
C.自定義標籤侷限性:不能用在if等tag語句中,而filter能夠用在if等tag語句中,如圖:
以下圖所示,能夠比較二者的使用方法和效果:
cookie
歡迎關注筆者我的公衆號:
session