Django教程(二)- Django檢視與網址進階

weixin_34185364發表於2017-07-12

目錄:

1. HTML表單

HTML 表單用於蒐集不同型別的使用者輸入。
表單是一個包含表單元素的區域。
表單元素是允許使用者在表單中輸入內容,比如:文字域(textarea)、下拉選單、單選框(radio-buttons)、核取方塊(checkboxes)等等。
表單使用表單標籤 <form> 來設定:

<form>
input elements
</form>

HTML 表單 - 輸入元素
多數情況下被用到的表單標籤是輸入標籤(<input>)。
輸入型別是由型別屬性(type)定義的。大多數經常被用到的輸入型別如下:

  • 文字域(Text Fields)
    文字域通過<input type="text"> 標籤來設定,當使用者要在表單中鍵入字母、數字等內容時,就會用到文字域。
<form>
First name: <input type="text" name="firstname"><br>
Last name: <input type="text" name="lastname">
</form> 

注意:表單本身並不可見。同時,在大多數瀏覽器中,文字域的預設寬度是20個字元。

  • 密碼欄位
    密碼欄位通過標籤<input type="password"> 來定義:
<form>
Password: <input type="password" name="pwd">
</form> 

注意:密碼欄位字元不會明文顯示,而是以星號或圓點替代。

  • 單選按鈕(Radio Buttons)
    <input type="radio"> 標籤定義了表單單選框選項
<form>
<input type="radio" name="gender" value="male">Male<br>
<input type="radio" name="gender" value="female">Female
</form> 
  • 核取方塊(Checkboxes)
    <input type="checkbox"> 定義了核取方塊. 使用者需要從若干給定的選擇中選取一個或若干選項。
<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"> 定義了提交按鈕.
    當使用者單擊確認按鈕時,表單的內容會被傳送到另一個檔案。表單的動作屬性定義了目的檔案的檔名。由動作屬性定義的這個檔案通常會對接收到的輸入資料進行相關的處理。:
<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)通常縮寫為CSRF或者XSRF:跨站請求偽造

CSRF攻擊可以理解為:攻擊者盜用了你的身份,以你的名義傳送惡意請求。
舉例來講,某個惡意的網站上有一個指向你的網站的連結,如果
某個使用者已經登入到你的網站上了,那麼當這個使用者點選這個惡意網站上的那個連結時,就會向你的網站發來一個請求,
你的網站會以為這個請求是使用者自己發來的,其實呢,這個請求是那個惡意網站偽造的。

CSRF能夠做的事情包括:以你名義傳送郵件,發訊息,盜取你的賬號,甚至於購買商品,虛擬貨幣轉賬......造成的問題包括:個人隱私洩露以及財產安全。

Django 提供的 CSRF 防護機制
django 第一次響應來自某個客戶端的請求時,會在伺服器端隨機生成一個 token,把這個 token 放在 cookie 裡。然後每次 POST 請求都會帶上這個 token,
這樣就能避免被 CSRF 攻擊。

  1. 在返回的 HTTP 響應的 cookie 裡,django 會為你新增一個 csrftoken 欄位,其值為一個自動生成的 token
  2. 在所有的 POST 表單時,必須包含一個 csrfmiddlewaretoken 欄位 (只需要在模板里加一個 tag, django 就會自動幫你生成,見下面)
  3. 在處理 POST 請求之前,django 會驗證這個請求的 cookie 裡的 csrftoken 欄位的值和提交的表單裡的 csrfmiddlewaretoken 欄位的值是否一樣。如果一樣,則表明這是一個合法的請求,否則,這個請求可能是來自於別人的 csrf 攻擊,返回 403 Forbidden.
  4. 在所有 ajax POST 請求裡,新增一個 X-CSRFTOKEN header,其值為 cookie 裡的 csrftoken 的值

Django 裡如何使用 CSRF 防護:

  1. 首先,最基本的原則是:GET 請求不要用有副作用。也就是說任何處理 GET 請求的程式碼對資源的訪問都一定要是“只讀“的。
  2. 要啟用 django.middleware.csrf.CsrfViewMiddleware 這個中介軟體
  3. 再次,在所有的 POST 表單元素時,需要加上一個 {% csrf_token %} tag
  4. 在渲染模組時,使用 RequestContext。RequestContext 會處理 csrf_token 這個 tag, 從而自動為表單新增一個名為 csrfmiddlewaretoken 的 input

3.程式碼操作

需求:模擬登入功能,如果使用者的名字是你的名字全拼且密碼是12345,則顯示登入成功,否則登入失敗
1.建立app:python manage.py startapp login
2.在app中建立templates資料夾,並簡單寫三個網頁,分別是登陸頁面,登陸成功頁面,登陸失敗頁面。

6078268-6d3d862b397ebc42.png
login.html

3.建立專案檢視的練習,詳情請見Django教程(一)- Django檢視與網址

6078268-001315d6ab9ca1e4.png
邏輯示意圖.png
  • 定義檢視函式
6078268-c139265e3e36c5d8.png
定義檢視函式views.py
  • 在app中建立urls.py,定義檢視函式相關的url
6078268-c852cb7438e7e5b2.png
建立urls.py
  • 在專案的urls.py中,匯入django.conf.urls.include模組,並且新增到urlpatterns列表
6078268-17886ae72ba35feb.png
修改專案中的urls.py
  • 把新定義的app加到settings.py中的INSTALL_APPS中
    測試:
6078268-de2a846ae3e8079e.png

輸入正確的使用者名稱和密碼:

6078268-9d065aa937cc8197.png

反之:

6078268-aaafce3b4c50e326.png

這裡只是為了完成需求,不考慮網頁的顯示的效果!233

注意:測試之前需在終端開啟伺服器python manage.py runserver 8001(埠號預設是8000,也可以選擇不設定!)

相關文章