美多商城專案(一)
1.在給用戶授權的時候,用到了一個%,表示的是任何ip都可以連接這個資料庫,換句話說,如果你換了電腦,你也是可以進行連接資料庫繼續開發的,
grant all on meiduo_mall.* to 'meiduo'@'%';
1.用戶資訊的存盤
用戶表分析
ID
用戶名
密碼
手機號
郵箱
是否管理員is_admin
是否注銷is_delete
想要生成表,需要定義一個模型類,Django里面不需要定義模型類了,
Django的認證系統已經為我們提供了一個用戶模型類,還提供了認證和授權功能,
Django認證機制依賴于session機制,但我們使用JWT認證機制,
is_staff是否可以訪問admin站點,相當于之前我們用的is_admin
is_superuser超級管理員
系統的模型類中,缺少我們需要的一些欄位,那么我們可以自定義用戶模型類,采用繼承就可以解決這個問題,在遷移之前,我們需要在組態檔中設定一下,否則,系統不知道我們定義了模型類,
AUTH_USER_MODEL = '子應用.模型類'
這里不是路徑,只是一個格式,注意即可,
AUTH_USER_MODEL = 'users.User'
如果我們直接使用了系統的模型類,那么那張用戶表叫做auth_users,
2.設計介面的思路
我們在接到了作業任務的時候,那么我們按照下面的思路來思考,
業務功能:分析子業務(子功能),每個子業務設計一個API介面
API設計程序:
- 介面的請求方式,如GET 、POST 、PUT等
- 介面的URL路徑定義
- 需要前端傳遞的資料及資料格式(如路徑引數、查詢字串、請求體表單、JSON等)
- 回傳給前端的資料及資料格式
2.1用戶注冊子業務
1.獲取短信驗證碼
2.用戶名是否存在
3.手機號是否存在
4.注冊資訊的保存
四個子業務,那么設計四個API介面,
2.1.1獲取短信驗證碼
API: GET /sms_codes/
/sms_codes/?P1[3-9]\d{9}/
引數:
通過url傳遞手機號
回應:
{
"message":"OK"
}
補充功能:
1.短信發送60s間隔限制(同一個手機在60之內只發一個短信驗證碼)
2.redis管道的使用:
可以向redis管道中添加多個redis命令,然后一次性進行執行(可以做到只連接一次redis,那么網站的效率會高一點,)
2.1.2 異步發短信
為什么使用:傳統的方式造成用戶長時間的等待
解決:
1.將發送短信的代碼抽取成一個函式
2.在短信發送API介面中創建一個行程呼叫發送短信函式,
問題:
1.如果客戶端請求較多,就會造成服務器壓力過大,
我們可以使用稍后介紹的celery
2.1.3Celery異步任務佇列
本質:通過提前創建的行程呼叫函式來實作異步的任務,
創建的行程可以在不同的服務器上,
概念:
1.任務執行者( worker):提前創建的行程
2.任務發出者:發出任務資訊,讓執行者去呼叫某個函式( 任務函式)
3.中間人( broker):存放任務訊息,
特點:
1.任務執行者的行程可以單獨在其他電腦上進行創建,
2.中間人又叫做任務佇列,先添加到佇列中的任務訊息會先被worker所執行,
3.生產者-消費者模型,
注意:中間人可以是rabbit-mq,也可以是redis,我們使用redis,
使用:
1.安裝
pip install celery
2.創建一個Celery類的物件并進行配置,是為了配置中間人的地址,
main.py
from celery import Celery
創建Celery類的物件
celery_app = Celery('demo')
加載配置
celery_app.config_from_object('組態檔的包路徑')
config.py
設定中間人地址borker
broker_url = 'redis://:/'
broker_url = 'redis://127.0.0.1:6379/3'
3.封裝任務函式
@celery_app.task(name='send_sms_code')
def send_sms_code(a,b):
# ...
pass
4.啟動celery的worker( 創建作業的行程)
celery -A 'celery_app物件所在檔案包路徑' worker -l <日志級別>
日志級別:critial fatal、error、warn、info、debug
5.發出任務訊息
send_sms_code.delay()
2.2用戶名是否存在
獲取用戶名的數量,
API:GET /usernames/(?P
引數:
通過url地址傳遞用戶名
回應:
{
"username":"用戶名",
"count":"數量"
}
2.3手機號是否存在
獲取手機號的數量,
API: GET /mobiles/(?P
引數:
通過url地址傳遞手機號
回應:
{
"mobile": "手機號",
"count": "數量"
}
3.通過域名訪問網站
靜態檔案服務器:127.0.0.1:8080 ---> www.ethanyan.site:8080
后端API服務器:127.0.0.1:8000 -----> api.ethanyan.site:8000
域名對應IP
通過域名訪問網站 --->DNS決議( 根據域名獲取對應的ip)--->再訪問ip對應的服務器,
通過域名訪問網站 --->先到本地 /etc/host檔案中查找域名和ip對應關系,如果找到,直接根據ip訪問對應的服務器,不再進行DNS決議,如果找不到,才會進行DNS決議程序,
注意:如果想通過一個域名訪問到Django網站服務器,需要將域名添加到 ALLOWED_HOSTS中,
4.一些小的知識點
1.日志的記錄等級,常見四種大小關系是:
DEBUG < INFO < WARNING < ERROR
只有記錄級別大于或者等于該級別的資訊才會輸出,
5.跨域地址
同源地址:對于兩個url地址,如果協議,ip和埠完全一致,這樣的地址就是同源地址,否則就不是同源地址,
跨域請求:客戶端發出請求時,如果源請求地址和被請求地址不是同源,這個請求就是跨域請求,
源請求地址: http://www.ethanyan.site:8080/
被請求地址: http://api.ethanyan.site:8000/
瀏覽器在發起ajax跨域請求時,會有CORS跨域請求的限制
在發起跨域請求時,在請求中攜帶一個請求頭:
Origin:源請求地址
被請求的服務器在回傳回應時,如果允許源地址對其進行跨域請求,需要在回應時攜帶一個回應頭:
Access-Control-Allow-Origin:源請求地址
瀏覽器如果發現被請求的服務器在回傳回應時,沒有攜帶 Access-Control-Allow-Origin:源請求地址回應頭,瀏覽器會直接將請求駁回,然后進行報錯,
答:是跨域請求,
總結
1.Django認證系統用戶模型類
class User(AbstractUser):
mobile = models.CharField(max_length=11,verbose_name='手機號')
....
AUTHUSERMODEL = 'users.User'
2.介面設計思路
分析子業務,每個子業務實作一個API介面
a.請求方式和URL地址
b.介面所需的引數和格式
c.介面的回應資料和格式
3.短信驗證碼獲取
基本業務邏輯
a.隨機生成6位數字作為短信驗證碼
b.在redis中存盤短信驗證碼內容,以 sms_
c.使用云通訊給手機號發送短信
d.回傳應答,短信發送成功
補充兩個功能:
a.短信發送60s間隔限制
b.redis管道的使用
4.本地域名設定
/etc/hosts
5.跨域請求
同源地址:協議,ip,port完全一致
跨域請求:瀏覽器發請求時,如果源地址和被請求地址不是同源,這個請求就是跨域,
瀏覽器針對Ajax跨域請求,有CORS跨域請求的限制,
6.celery異步任務佇列
使用celery異步發送短信驗證碼,解決用戶點擊獲取短信驗證碼之后,長時間等待,
7.用戶名和手機號是否存在
獲取用戶名數量
1.根據用戶名查詢資料庫,獲取查詢結果數量
2.回傳用戶名數量
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/55428.html
標籤:其他
