Django 專案總結(1)- 註冊及登入
Django 專案結束,對專案進行簡單總結
專案準備
美多商城是一種 B2C 的商業模式,即企業對個人,這種模式一般是網上購物,代表有京東、淘寶。
需求分析
使用者模組
商品模組
購物車模組
訂單模組
支付模組
專案架構
- 專案採用前後端分離的應用模式
- 前端使用 vue.js
- 後端使用 Django REST framework
- 資料庫使用:mysql、redis
- 非同步服務:celery
- 分散式服務:FastDFS
建立工程
使用 git 來管理專案程式碼,程式碼放在 gitee 或者 github,公司通常也會放在 gitlab 私有伺服器中
建立專案
使用前端 node.js 提供的伺服器 live-server 作為前端開發伺服器使用
建立資料庫,建立資料庫使用者
create database meiduo_mall default charset=utf8;
create user meiduo identified by 'meiduo';
grant all on meiduo_mall.* to 'meiduo'@'%';
flush privileges;
配置
修改settings/dev.py 檔案中的路徑資訊
在INSTALLED_APPS中新增rest_framework
資料庫 mysql
Redis
本地化語言與時區
日誌
異常處理
使用者部分
基本功能:使用者註冊、登入、忘記密碼、第三方(QQ登入)、個人資訊、地址管理、修改密碼
建立使用者模型類:Django提供了django.contrib.auth.models.AbstractUser使用者抽象模型類允許我們繼承,擴充套件欄位來使用Django認證系統的使用者模型類。
使用者註冊
圖片驗證碼和簡訊驗證碼
圖片驗證碼和簡訊驗證碼可能後續也會使用,將這兩個放到一個單獨的應用中 verifications,在此應用中實現圖片驗證碼、簡訊驗證碼。
驗證碼流程分析:
- 前端生成圖片驗證碼對應的 UUID;
- 傳送請求到後端,由後端(使用第三方擴充套件 captcha)生成圖片驗證碼的文字和圖片,圖片返回給前端,文字以 UUID 為鍵存到redis中;
- 前端展示圖片驗證碼,使用者進行輸入,
- 點擊發送簡訊按鈕,傳送請求到後端,對圖片驗證碼進行校驗,同時也判斷一下簡訊傳送的頻率
- 校驗通過,生成簡訊驗證碼,儲存簡訊驗證碼,在這裡在儲存一個簡訊驗證碼傳送間隔,防止多次傳送,傳送簡訊驗證碼(使用第三方擴充套件 雲通訊)
判斷使用者名稱是否存在
- 使用者輸入使用者名稱之後使用 axios 區域性重新整理頁面
- 後臺查詢資料庫使用者是否存在
- 返回資料給前端
判斷手機號碼是否已經存在
- 使用者輸入手機號之後使用 axios 區域性重新整理頁面
- 後臺查詢資料庫手機號是否存在
- 返回資料給前端
前端進行初步操作
使用正則判斷使用者名稱是否符合規則
使用正則判斷密碼輸入是否符合規則且兩次輸入是否一致
使用正則判斷手機號是否符合規則
註冊
1.資訊輸入完後,點選註冊,向後端傳送請求,將資料傳到後端
2.後端通過序列化器對資料進行驗證,並將資料儲存到資料庫中
3.生成儲存當前使用者登入資訊的 JWT token
4.返回資訊,註冊成功
使用到的技術點
celery
前端使用者將圖片驗證碼傳送給後臺之後,第三方平臺傳送簡訊的過程中會有網路的阻塞程式繼續往下執行,進而影響使用者體驗效果;
解決方案:採用celery進行簡訊驗證碼的非同步傳送;
Celery概念:分散式非同步任務佇列排程框架:
1,支援定時任務和非同步任務兩種方式
2,組成:大概分為四個部分client客戶端傳送資料,broker中介軟體(redis資料庫,訊息佇列),worker(任務的執行者),backend(執行worker任務的執行結果)
3,可以開啟多程序也可以是多執行緒
4,應用場景:在某一個任務的執行過程中,會涉及到耗時的操作,但是這個耗時操作並不會影響後續的程式的執行,此時就可以用celery來非同步執行這些任務;
跨域請求:
為前後端各設定一個域名,請求時就會出現跨域請求
跨域請求CORS
OPTION
瀏覽器會發送給option請求詢問,後端是否支援
後端提供option請求的支援,告訴瀏覽器,支援哪些域名訪問
Django中介軟體提供option請求
安裝第三方包:pip install django-cors-headers
新增應用,設定中間層,在最上邊新增中介軟體,新增白名單
JWT token:
在使用者登入後,我們需要記錄使用者的登入狀態,傳統的是使用 session 進行儲存,每個使用者登入後都會在後端做一次記錄,session 儲存在記憶體中,隨著使用者增多,服務端開銷會增大;擴充套件性不好,使用者必須請求儲存 session 的這臺伺服器;session 是基於 cookie 的,如果 cookie 被攔截,使用者容易受到跨站請求偽造攻擊。
JWT 有三部分組成:header(頭部)、payload(載荷)、signature(簽名),由這三部分生成 token,可以攜帶資訊,安全性也有保障,便於傳輸,不需要再服務端儲存會話資訊,易於應用的擴充套件,只需要每次請求把 token 帶上即可。
手動簽發 JWT:
from rest_framework_jwt.settings import api_settings
jwt_payload_handler = api_settings.JWT_PAYLOAD_HANDLER
jwt_encode_handler = api_settings.JWT_ENCODE_HANDLER
payload = jwt_payload_handler(user)
token = jwt_encode_handler(payload)
前端儲存 token
sessionStorage 瀏覽器關閉即失效
localStorage 長期有效
登入
登入最重要的就是登入資訊的儲存;
Django REST framework JWT 提供了登入簽發 JWT 的檢視 obtain_jwt_token,可以直接使用,會預設返回 token;
自定義可以使用使用者名稱或者手機號登入。
使用正則判斷,根據對應資訊進行資料查詢對應使用者,重寫認證後端,加上判斷。