先後端不分離 用戶

# 02-註冊頁面html

#### web開發流程:前端

* 1.前端發請求 --後臺
* 2.後臺
* 正則校驗過 路由url--接收請求:
* --解析請求----解析參數
* 業務邏輯處理 crud
* 3.返回給前端數據
* render(request,'index.html',context={})
* JsonResponse([],safe=False)vue

####請求方式:request.methodpython

* GET -------查詢
* POST------增長
* PUT --------修改
* Delete---------刪除mysql

#### 傳參的四種方式:4個web

* ?a=12&b=20----------request.GET==>queryDict.get() getlist()
* /a/b/ ----------------- 直接解析---def get(self,request,a,b)
* 請求體:
* 非表單 ---------- json-----request.body===>bytes==decode()=== json.loads(json_str)
* 表單 ----------------request.POST
* 請求頭 ---------------request.METAajax

#### vue 基本操做:
* 1.隱藏和顯示 v-show
* 2.--v-model: input select textarea
* 3.操做屬性 v-bind 簡寫 :
* 4. 操做事件 v-on 簡寫 @
* 5. 大量的重複標籤: v-for
* 6. 條件判斷 v-if v-else-if
* 7.操做數據 {{ }}===jinja2 {{ }}
* 8. vue的生命週期:mounted 對象加載完畢redis

#### django數據庫查詢: ORMsql

* User模型類數據庫

* 增
* Save()
* create() ------User.objects.create()
* 刪
* Delete()
* User.objects.filter(id=1).delete()
* 改
* Save()
* Update()---User.objects.filter(id=1).update()
* 查
* get() all() filter()
* 關聯查詢
* 1:n -----1.n純小寫_set(related_name).all() ---------1.objects.filter(n純小寫___n的屬性=值)
* n(外鍵):1-----n.外鍵屬性---------------------------------------------n.objects.filter(外鍵屬性__運算符=值)
* 外鍵屬性 外鍵_id hbook hbook_id

 

### 做業 註冊容聯雲帳號,熟悉頁面和開發文檔--10分鐘 https://www.yuntongxun.com/

* 1.千萬記得 天天第一件是 測試代碼運行是否成功!
* 2.根據提交的日誌 看一下昨天的進度
* 3.替換文件 素材---替換文件

 

## 1.註冊功能 POST

```python
# 1.解析參數--request.POST
# 2.判空
# 3.判正則

# 4.註冊---->增長 create() save()

# 5.重定向到首頁
pass

# 接口文檔
# url: register
# method:POST
# 參數:form傳參
# 響應:成功---跳轉首頁
# 失敗--- 提示

# 1.用戶名 ---判空--判正則---是否重複
# 2.密碼 ---判空--判正則
# 3.確認密碼 == 是否一致
# 4.手機號 ---判空--判正則---是否重複
# 5.協議 ---必須勾選
# 圖形驗證碼 ---判空-
# 短信驗證碼 ---判空-
```

 

建立用戶模塊應用 在apps包下建立應用users 展現用戶註冊頁面

註冊用戶模塊應用 準備用戶註冊模板文件 請求方式和路由

定義用戶註冊視圖 1.總路由 2.子路由

## 2.用戶的模型類 https://yiyibooks.cn/xx/Django_1.11.6/topics/auth/customizing.html

```python
用戶模型類自定義
   新知識點: ---使用django的User模型類: 緣由: 加解密密碼--權限認證--用戶管理
           ----自定義User模型類: 不知足 mobile 手機號

   # 1.models.py : 自定義User模型類: 導包 繼承AbstractUser 添加新屬性 mobile字段  粘貼
   # 2.dev.py -- 修改 djangoUser模型類 配置:AUTH_USER_MODEL = 'users.User'
   # 3.數據遷移  python manage.py makemigrations
                python manage.py migrate
```

## 3. 註冊用戶 功能

* 1. 開開發文檔-- 使用user對象
* `from apps.ausers.models import User
User.objects.create_user(username=username,password=password,mobile=mobile)
`

## 2. 建立了首頁contents 應用--註冊app--總路由--子路由---類視圖函數---render(request,'index.html')

* 1.替換 index.html index.js
* 2.註冊子應用contents--註冊app.--zong--zi --類視圖---render

##3.保持登陸狀態 --session--cookie

* 1.session 1.設置request.session['k'] =v 2. request.session['k']校驗   保持登陸狀態 === 原生代碼
* 2.django User保持登陸狀態login(request,user)
* 127.0.0.1:6379 connection refused --- redis沒開啓服務
* duplicate zhangsan -----用戶名重複註冊

# 1. 註冊頁面顯示

# 1.路由
# 2.類視圖 get
# 3.render(request,'register.html')

# 1.解析參數--request.POST

# 判斷空 all()

 # 1.用戶名 ---判空--判正則---是否重複

# 2.密碼 ---判空--判正則

# 3.確認密碼  == 是否一致

# 4.手機號 ---判空--判正則---是否重複

 # 5.協議   ---必須勾選

# 短信驗證碼 ---判空-
# 1.獲取用戶 給的 參數 sms_code

# 2.連接redis 數據庫 3號庫

# 3.取出redis的短信

# 4. 用戶短息 和  後臺redis短信校驗

# 4.註冊---->增長 create() save()

# 保持登陸狀態 === 原生代碼: request.session['user_id']=user.id
# django認證系統:login(request,user)

# 5.重定向到首頁

 

## 4.判斷用戶名是否重複

* 1.接收用戶名 username
* 2.校驗判空 和 正則
* 3.邏輯數據庫查詢 User.objects.filter(username=username).count()
* 4.返回給前端
## 5.判斷手機號是否重

- 1.接收用戶名 username
- 2.校驗判空 和 正則
- 3.邏輯數據庫查詢 User.objects.filter(mobile=mobile).count() 查詢數據庫 user用戶 --統計個數
- 4.返回給前端

 

## 6.圖片驗證碼

* 1. 前端發請求-->key---UUID 惟一碼  
2. 接收請求 UUID 參數, 正則校驗

3. 生成圖片驗證碼( 隨機產生的 )--第三方
4. 使用redis存儲 隨機碼(UUID:code)--django_redis
5. 返回前端 圖片驗證碼--二進制流 content_type="image/png"

獲取圖片驗證碼

# 1.接收參數(前端發請求-->key---UUID  惟一碼)

# 2.正則校驗(接收請求 UUID 參數, 正則校驗)

# 3.生成圖片驗證碼 (使用django-redis存儲 隨機碼(UUID:code))

# 4.保存圖片驗證碼---redis--'verify_image_code' 設置過時時間setex (# constants.IMAGE_CODE_REDIS_EXPIRES 代碼易擴展)

# 5.返回前端 圖片--bytes ----MIME ----文件格式 'image/png'  )(返回前端 圖片驗證碼--二進制流)

 

 

## 7.短信驗證碼

#### 1.容聯雲的介紹

* 1.註冊
* 2.建立應用
* 3.開發文檔
* 4.下載 SDK 包

#### 2.發短信流程

* 1.接收參數 解析參數
* 2.校驗圖形驗證碼
* 3.生成隨機6位碼
* 4.發送短信CCP
* 5.使用redis存儲 6位碼
* 6.返回響應對象

 

03-驗證碼

## 1.短信驗證碼

* 1.接收 2個 mobile; 圖片驗證碼img_code
* 2.驗證碼 img_code和redis存儲的驗證碼 是否一致 (1.redis取出來(4步) 2.判斷是否相等 3.redis img_code 刪除) **千萬注意 redis取出來類型 是 Bytes.decode()**
* 3.生成隨機 6位 短信驗證碼內容 random.randit()
* 4.存儲 隨機6位 redis裏面(3步 )
* 5.發短信---第三方容聯雲--
* 6.返回響應對象

 

## 2.註冊驗證短信驗證碼

* ```python
2. 補充了 註冊功能-- 短信校驗
1. 接收 用戶 輸入的 短信---注意:msg_code
2. 連接redis
3. 從redis 取短信
4. 校驗
```

## 3.後臺避免頻繁發送短信

* 1.標記--開關(按鈕點擊, 不能點擊)
* 2. 60秒倒計時:---redis.setex(k,60,1)
3. 獲取redis裏面的標識
4. 標識沒有---從新發短信--從新倒計時
5. 標識有---直接return

## 4.redis管道操做

* ​ 1.做用: 減小 redis客戶端和後臺的交互,提升操做效率

* 2. pipeline = client.pipeline()
3. pipeline.setex()
4. pipeline.exectue()

 

# 5.生產消費者模式

#### 1. 生產者 --- 消息隊列----消費者

* 生產者productor----負責產生任務

* 消息隊列broker---先進先去 --- 存儲任務的倉庫--redis或者rabbitmysql

* 消費者worker---- 執行任務

*

#### 2.celery

* 將 生產者, 消息隊列,消費者 三者 統一管理調度, 減小重複代碼,和 調用流程的工具

#### 3.celery的操做

* 1. pip install -U Celery
2. 在項目目錄下---celery_tasks 包
3. celery_tasks 包---main.py
4. --main.py: 1.導包celery 2.os環境配置--django項目環境 3.實例化對象
5. 消息隊列broker---config.py -``---main.py---加載配置文件
6. 生產者:--celery_tasks 包-->sms包--tasks.py(名字不能改)
7. -tasks.py(名字不能改)---1. 把之前發短信的代碼粘貼過來 --寫個函數 2.@app.task
8. main.py---註冊任務
9. 消費者: ---進終端--啓動服務--- 粘貼指令 `celery -A celery_tasks.main worker -l info`
10. 註冊功能裏面 --觸發 異步任務 delay

 

 短信驗證碼

 # 1.解析參數 front_img_code  uuid

 # 2.校驗

3.校驗圖片驗證碼--redis
# 3.1 連接redis2號數據庫

# 3.2 從redis取出 存儲的圖片驗證碼

# 千萬注意: redis取出來的值  ---bytes=-decode()

# 4. 生成隨機 6位碼數 import random

# 5. 保存 6位碼數---redis
# 5.1 連接redis3號數據庫 使用 容聯雲 發送短信

 # 1.獲取 redis裏面的標識

 # 2.判斷 若是倒計時的標識在-- 再也不發送

 # 建立管道(存儲短信)

 # 3.從新倒計時 60秒

 # 5.2 去redis 存儲的 短信驗證碼

 # 執行管道

# 異步發送短信 使用 celery  

 # 6. 返回響應對象

 

# 6. 用戶登陸

##### 1.登陸頁面顯示 render

##### 2. 登陸功能

* 1.接收參數 : username password 記住登陸remembered
* 2.校驗
* 3. 判斷用戶名和密碼 是否正確(

# orm --傳統---User.objects.get(username=username,password=password)
# django認證系統 authenticate(username=username,password=password)


4. 保持登陸狀態 login()

# 記住 None 默認 2 周

# 不記住 -- 會話結束就失效

# next 獲取
5. 跳轉到首頁 redirect(reverse('contents:index'))

 

##### 3. 首頁顯示用戶名

* 1.login.html ---- > index.html
* 2.sessionid--user_id--->ajax---user
* 3.request.user ---
* 4. Login--存儲到response.set_cookie---前端index.js--從cookie讀取

 

##### 3. 首頁顯示用戶名

* 1.login.html ---- > index.html
* 2.sessionid--user_id--->ajax---user
* 3.request.user ---
* 4. Login--存儲到response.set_cookie---前端index.js--從cookie讀取

#### 4.多帳號登陸: authenticate()   寫在utils裏面

* 1.擴展本身的mobile識別登陸功能 自定義 ; django.contrib.auth.backends.ModelBackend

根據account查詢用戶,判斷  用戶名  和 手機號的 多帳號 

* 1. 導包 from django.contrib.auth.backends import ModelBacken
2. 繼承
3. 重寫父類函數 authenticate

# 根據傳入的username獲取user對象。username能夠是手機號也能夠是帳號

# 校驗user是否存在並校驗密碼是否正確

4. 去配置文件 dev.py 修改配置 AUTHENTICATION_BACKENDS = ['apps.users.utils.UsernameMobileAuthBackend']

 

#### 5. 退出--logout(request)

#### 6. 判斷是否登陸

* 1. user = User.objects.get(username=username) if user:
2. Is_authenticate():
3. 裝飾器 login_required
4. 擴展類 LoginRequiredMixin

 

# 1.退出本質--清除session request.session.clear()
# 2. logout()  logout(request)

# 重定向首頁

# 清空cookie  response.delete_cookie('username') 退出登陸時清除cookie中的username

相關文章
相關標籤/搜索