# 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
展現用戶註冊頁面
註冊用戶模塊應用 準備用戶註冊模板文件 請求方式和路由## 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