Django教程(二)- Django視圖與網(wǎng)址進(jìn)階

目錄:

1. HTML表單

HTML 表單用于搜集不同類(lèi)型的用戶輸入。
表單是一個(gè)包含表單元素的區(qū)域。
表單元素是允許用戶在表單中輸入內(nèi)容,比如:文本域(textarea)、下拉列表、單選框(radio-buttons)、復(fù)選框(checkboxes)等等。
表單使用表單標(biāo)簽 <form> 來(lái)設(shè)置:

<form>
input elements
</form>

HTML 表單 - 輸入元素
多數(shù)情況下被用到的表單標(biāo)簽是輸入標(biāo)簽(<input>)。
輸入類(lèi)型是由類(lèi)型屬性(type)定義的。大多數(shù)經(jīng)常被用到的輸入類(lèi)型如下:

  • 文本域(Text Fields)
    文本域通過(guò)<input type="text"> 標(biāo)簽來(lái)設(shè)定,當(dāng)用戶要在表單中鍵入字母、數(shù)字等內(nèi)容時(shí),就會(huì)用到文本域。
<form>
First name: <input type="text" name="firstname"><br>
Last name: <input type="text" name="lastname">
</form> 

注意:表單本身并不可見(jiàn)。同時(shí),在大多數(shù)瀏覽器中,文本域的缺省寬度是20個(gè)字符。

  • 密碼字段
    密碼字段通過(guò)標(biāo)簽<input type="password"> 來(lái)定義:
<form>
Password: <input type="password" name="pwd">
</form> 

注意:密碼字段字符不會(huì)明文顯示,而是以星號(hào)或圓點(diǎn)替代。

  • 單選按鈕(Radio Buttons)
    <input type="radio"> 標(biāo)簽定義了表單單選框選項(xiàng)
<form>
<input type="radio" name="gender" value="male">Male<br>
<input type="radio" name="gender" value="female">Female
</form> 
  • 復(fù)選框(Checkboxes)
    <input type="checkbox"> 定義了復(fù)選框. 用戶需要從若干給定的選擇中選取一個(gè)或若干選項(xiàng)。
<form>
<input type="checkbox" name="vehicle" value="Bike">I have a bike<br>
<input type="checkbox" name="vehicle" value="Car">I have a car
</form> 
  • 提交按鈕(Submit Button)
    <input type="submit"> 定義了提交按鈕.
    當(dāng)用戶單擊確認(rèn)按鈕時(shí),表單的內(nèi)容會(huì)被傳送到另一個(gè)文件。表單的動(dòng)作屬性定義了目的文件的文件名。由動(dòng)作屬性定義的這個(gè)文件通常會(huì)對(duì)接收到的輸入數(shù)據(jù)進(jìn)行相關(guān)的處理。:
<form name="input" action="html_form_action.php" method="get">
Username: <input type="text" name="user">
<input type="submit" value="Submit">
</form

2.CSRF

CSRF(Cross-site request forgery)通常縮寫(xiě)為CSRF或者XSRF:跨站請(qǐng)求偽造

CSRF攻擊可以理解為:攻擊者盜用了你的身份,以你的名義發(fā)送惡意請(qǐng)求。
舉例來(lái)講,某個(gè)惡意的網(wǎng)站上有一個(gè)指向你的網(wǎng)站的鏈接,如果
某個(gè)用戶已經(jīng)登錄到你的網(wǎng)站上了,那么當(dāng)這個(gè)用戶點(diǎn)擊這個(gè)惡意網(wǎng)站上的那個(gè)鏈接時(shí),就會(huì)向你的網(wǎng)站發(fā)來(lái)一個(gè)請(qǐng)求,
你的網(wǎng)站會(huì)以為這個(gè)請(qǐng)求是用戶自己發(fā)來(lái)的,其實(shí)呢,這個(gè)請(qǐng)求是那個(gè)惡意網(wǎng)站偽造的。

CSRF能夠做的事情包括:以你名義發(fā)送郵件,發(fā)消息,盜取你的賬號(hào),甚至于購(gòu)買(mǎi)商品,虛擬貨幣轉(zhuǎn)賬......造成的問(wèn)題包括:個(gè)人隱私泄露以及財(cái)產(chǎn)安全。

Django 提供的 CSRF 防護(hù)機(jī)制
django 第一次響應(yīng)來(lái)自某個(gè)客戶端的請(qǐng)求時(shí),會(huì)在服務(wù)器端隨機(jī)生成一個(gè) token,把這個(gè) token 放在 cookie 里。然后每次 POST 請(qǐng)求都會(huì)帶上這個(gè) token,
這樣就能避免被 CSRF 攻擊。

  1. 在返回的 HTTP 響應(yīng)的 cookie 里,django 會(huì)為你添加一個(gè) csrftoken 字段,其值為一個(gè)自動(dòng)生成的 token
  2. 在所有的 POST 表單時(shí),必須包含一個(gè) csrfmiddlewaretoken 字段 (只需要在模板里加一個(gè) tag, django 就會(huì)自動(dòng)幫你生成,見(jiàn)下面)
  3. 在處理 POST 請(qǐng)求之前,django 會(huì)驗(yàn)證這個(gè)請(qǐng)求的 cookie 里的 csrftoken 字段的值和提交的表單里的 csrfmiddlewaretoken 字段的值是否一樣。如果一樣,則表明這是一個(gè)合法的請(qǐng)求,否則,這個(gè)請(qǐng)求可能是來(lái)自于別人的 csrf 攻擊,返回 403 Forbidden.
  4. 在所有 ajax POST 請(qǐng)求里,添加一個(gè) X-CSRFTOKEN header,其值為 cookie 里的 csrftoken 的值

Django 里如何使用 CSRF 防護(hù):

  1. 首先,最基本的原則是:GET 請(qǐng)求不要用有副作用。也就是說(shuō)任何處理 GET 請(qǐng)求的代碼對(duì)資源的訪問(wèn)都一定要是“只讀“的。
  2. 要啟用 django.middleware.csrf.CsrfViewMiddleware 這個(gè)中間件
  3. 再次,在所有的 POST 表單元素時(shí),需要加上一個(gè) {% csrf_token %} tag
  4. 在渲染模塊時(shí),使用 RequestContext。RequestContext 會(huì)處理 csrf_token 這個(gè) tag, 從而自動(dòng)為表單添加一個(gè)名為 csrfmiddlewaretoken 的 input

3.代碼操作

需求:模擬登錄功能,如果用戶的名字是你的名字全拼且密碼是12345,則顯示登錄成功,否則登錄失敗
1.創(chuàng)建app:python manage.py startapp login
2.在app中創(chuàng)建templates文件夾,并簡(jiǎn)單寫(xiě)三個(gè)網(wǎng)頁(yè),分別是登陸頁(yè)面,登陸成功頁(yè)面,登陸失敗頁(yè)面。

login.html

3.建立項(xiàng)目視圖的練習(xí),詳情請(qǐng)見(jiàn)Django教程(一)- Django視圖與網(wǎng)址

邏輯示意圖.png
  • 定義視圖函數(shù)
定義視圖函數(shù)views.py
  • 在app中創(chuàng)建urls.py,定義視圖函數(shù)相關(guān)的url
創(chuàng)建urls.py
  • 在項(xiàng)目的urls.py中,導(dǎo)入django.conf.urls.include模塊,并且添加到urlpatterns列表
修改項(xiàng)目中的urls.py
  • 把新定義的app加到settings.py中的INSTALL_APPS中
    測(cè)試:

輸入正確的用戶名和密碼:

反之:

這里只是為了完成需求,不考慮網(wǎng)頁(yè)的顯示的效果!233

注意:測(cè)試之前需在終端打開(kāi)服務(wù)器python manage.py runserver 8001(端口號(hào)默認(rèn)是8000,也可以選擇不設(shè)置!)

最后編輯于
?著作權(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)容