1. 程式人生 > >Django 專案總結(1)- 註冊及登入

Django 專案總結(1)- 註冊及登入

Django 專案結束,對專案進行簡單總結

程式碼 GitHub 地址




專案準備

美多商城是一種 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,在此應用中實現圖片驗證碼、簡訊驗證碼。

驗證碼流程分析:

  1. 前端生成圖片驗證碼對應的 UUID;
  2. 傳送請求到後端,由後端(使用第三方擴充套件 captcha)生成圖片驗證碼的文字和圖片,圖片返回給前端,文字以 UUID 為鍵存到redis中;
  3. 前端展示圖片驗證碼,使用者進行輸入,
  4. 點擊發送簡訊按鈕,傳送請求到後端,對圖片驗證碼進行校驗,同時也判斷一下簡訊傳送的頻率
  5. 校驗通過,生成簡訊驗證碼,儲存簡訊驗證碼,在這裡在儲存一個簡訊驗證碼傳送間隔,防止多次傳送,傳送簡訊驗證碼(使用第三方擴充套件 雲通訊)



判斷使用者名稱是否存在

  1. 使用者輸入使用者名稱之後使用 axios 區域性重新整理頁面
  2. 後臺查詢資料庫使用者是否存在
  3. 返回資料給前端

判斷手機號碼是否已經存在

  1. 使用者輸入手機號之後使用 axios 區域性重新整理頁面
  2. 後臺查詢資料庫手機號是否存在
  3. 返回資料給前端



前端進行初步操作

使用正則判斷使用者名稱是否符合規則

使用正則判斷密碼輸入是否符合規則且兩次輸入是否一致

使用正則判斷手機號是否符合規則




註冊

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;

自定義可以使用使用者名稱或者手機號登入。

使用正則判斷,根據對應資訊進行資料查詢對應使用者,重寫認證後端,加上判斷。