Django-實(shí)現(xiàn)圖形驗(yàn)證碼、短信驗(yàn)證碼功能(一)

驗(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ā)文檔定義路由路徑

  1. 總路由
    在總路由中添加規(guī)則:
url('^', include('verifycations.urls')),
  1. 子路由
    使用正則匹配前端傳輸?shù)膗uid唯一標(biāo)識(shí)
url('^image_codes/(?P<uuid>[\w-]+)/$', views.ImageCodeView.as_view()),
  1. 視圖函數(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)下一篇文章:

Django-實(shí)現(xiàn)圖形驗(yàn)證碼、短信驗(yàn)證碼功能(二)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容