驗(yàn)證碼常用于注冊(cè)場(chǎng)景,用以防止惡意寫(xiě)入數(shù)據(jù)。
在簡(jiǎn)單的注冊(cè)業(yè)務(wù)中,用戶填寫(xiě)注冊(cè)信息后,需要填寫(xiě)驗(yàn)證碼。
后臺(tái)再根據(jù)各項(xiàng)目規(guī)則對(duì)每項(xiàng)進(jìn)行校驗(yàn),完全校驗(yàn)通過(guò)后才完成注冊(cè)。
注冊(cè)時(shí),為了防止惡意注冊(cè),往往采用圖像驗(yàn)證碼結(jié)合短信驗(yàn)證碼的方式。
圖像驗(yàn)證碼、短信驗(yàn)證碼的表單提交、后端校驗(yàn)實(shí)現(xiàn)邏輯
- 前端請(qǐng)求圖像驗(yàn)證碼,并攜帶uuid唯一標(biāo)識(shí)符(GET請(qǐng)求)
- 后端收到請(qǐng)求后生成驗(yàn)證碼字符串和對(duì)應(yīng)驗(yàn)證碼圖片
- 后端將uuid與驗(yàn)證碼字符串以鍵值對(duì)形式存入數(shù)據(jù)庫(kù),如redis,并設(shè)置過(guò)期時(shí)間
- 后端將驗(yàn)證碼圖片數(shù)據(jù)以響應(yīng)給前端加載顯示給用戶
- 用戶在前端頁(yè)面輸入圖像驗(yàn)證碼
- 用戶前端輸入手機(jī)號(hào)請(qǐng)求短信驗(yàn)證碼,并攜帶圖像驗(yàn)證碼與uuid參數(shù)(POST請(qǐng)求)
- 后端接收請(qǐng)求,獲取圖像驗(yàn)證碼、uuid、手機(jī)號(hào)
- 后端根據(jù)uuid鍵在數(shù)據(jù)庫(kù)中查找對(duì)應(yīng)圖像驗(yàn)證碼值,與提交的值比較,若一致,執(zhí)行發(fā)送短信驗(yàn)證碼;否則,返回圖像驗(yàn)證碼錯(cuò)誤
- 生成隨機(jī)短信驗(yàn)證碼,保存至數(shù)據(jù)庫(kù),如redis中
- 使用第三方平臺(tái)如容聯(lián)云通訊發(fā)送短信驗(yàn)證碼(使用celery異步執(zhí)行)
- 響應(yīng)狀態(tài)碼
以下只實(shí)現(xiàn)后端圖形驗(yàn)證碼發(fā)送功能,注冊(cè)驗(yàn)證功能暫不敘述,給自己留個(gè)坑。
圖形驗(yàn)證碼后端發(fā)送實(shí)現(xiàn)
接口定義
根據(jù)前端請(qǐng)求路徑或開(kāi)發(fā)文檔定義路由路徑
- 總路由
在總路由中添加規(guī)則:
url('^', include('verifycations.urls')),
- 子路由
使用正則匹配前端傳輸?shù)膗uid唯一標(biāo)識(shí)
url('^image_codes/(?P<uuid>[\w-]+)/$', views.ImageCodeView.as_view()),
- 視圖函數(shù)定義
- 定義get方法倆接收GET請(qǐng)求
- 參數(shù)中接收url中的uuid
- 使用第三方包c(diǎn)aptcha來(lái)自動(dòng)生成圖形驗(yàn)證碼
text, code, image = captcha.generate_captcha()
調(diào)用方法可解包得到三個(gè)數(shù)據(jù),分別為標(biāo)識(shí)碼、驗(yàn)證碼字符串、驗(yàn)證碼圖片二進(jìn)制數(shù)據(jù)。第二個(gè)和第三個(gè)數(shù)據(jù)是這里要使用的。 - 需要安裝Pillow包
- 在settings中添加redis圖形驗(yàn)證碼的緩存設(shè)置,選擇redis的2號(hào)數(shù)據(jù)庫(kù)為圖形驗(yàn)證碼儲(chǔ)存位置。
# 緩存
CACHES = {
"default": { # 默認(rèn)
"BACKEND": "django_redis.cache.RedisCache",
"LOCATION": "redis://127.0.0.1:6379/0", # 可改:ip、port、db
"OPTIONS": {
"CLIENT_CLASS": "django_redis.client.DefaultClient",
}
},
"session": { # session
"BACKEND": "django_redis.cache.RedisCache",
"LOCATION": "redis://127.0.0.1:6379/1",
"OPTIONS": {
"CLIENT_CLASS": "django_redis.client.DefaultClient",
}
},
"image_code": { # 圖形驗(yàn)證碼
"BACKEND": "django_redis.cache.RedisCache",
"LOCATION": "redis://127.0.0.1:6379/2",
"OPTIONS": {
"CLIENT_CLASS": "django_redis.client.DefaultClient",
}
},
}
視圖函數(shù)實(shí)現(xiàn)如下:
from django.views import View
from meiduo_mall.libs.captcha.captcha import captcha
from django_redis import get_redis_connection
# 自定義的驗(yàn)證碼過(guò)期時(shí)間配置文件
from . import constants
from django import http
class ImageCodeView(View):
def get(self, request, uuid):
# 接收
# 驗(yàn)證
# 處理:
# 1.生成圖片的文本、數(shù)據(jù)
text, code, image = captcha.generate_captcha()
# 2.連接到redis
redis_cli = get_redis_connection('image_code')
# 3.保存圖片文本,用于后續(xù)與用戶輸入值對(duì)比,設(shè)置過(guò)期時(shí)間
redis_cli.setex(uuid, constants.IMAGE_CODE_EXPIRES, code)
# 4.響應(yīng):輸出圖片數(shù)據(jù)
return http.HttpResponse(image, content_type='image/png')
結(jié)合前端頁(yè)面刷新加載和的點(diǎn)擊刷新邏輯,圖形驗(yàn)證碼的發(fā)送功能就實(shí)現(xiàn)了。
短信驗(yàn)證碼后端發(fā)送實(shí)現(xiàn)
見(jiàn)下一篇文章: