Django實現短信驗證碼


Django短信驗證

最終實現效果:

在前端頁面添加有關短信驗證的標簽:

<input type="text" name="msg_code" id="msg_code" v-model="sms_code" @blur="check_sms_code">
<a href="javascript:;" @click="send_sms_code">[[sms_code_tip]]</a>
<span v-show="error_image_code">[[ error_sms_code_message ]]</span>

name="msg_code"用於視圖函數中接收參數

v-model="sms_code"用於vue中雙向綁定數據

@blur="check_sms_code"調用vue中的校驗方法

href="javascript:;"請求地址由vue生成

@click="send_sms_code"調用vue中的發送短信驗證碼方法

[[sms_code_tip]]當未發送短信驗證碼時,顯示"點擊發送短信驗證碼".點擊之后變為60s倒計時.因此vue中也要聲明這個變量

v-show="error_sms_code"布爾類型,true表示顯示錯誤信息,false表示不顯示.默認為false

[[ error_sms_code_message ]]顯示的錯誤提示,如"請填寫短信驗證碼"

vue中添加相應的字段和方法:

data:{
    error_sms_code:false,
    error_sms_code_message:'請填寫短信驗證碼',
    sms_code:'',
    sms_code_tip: '獲取短信驗證碼',
    sending_flag:false
},
methods:{
    // 校驗短信驗證碼
        check_sms_code:function(){
            // 校驗非空
            if(this.sms_code == ""){
                this.error_sms_code_message = "短信驗證碼不能為空"
                this.error_sms_code = true;
            }
        },
        // 發送短信驗證碼
        send_sms_code:function(){
            if(this.sending_flag == true){
                return;
            }
            this.sending_flag = true;

            // 校驗參數,保證輸入框中數據非空
            this.check_phone();
            this.check_image_code();
            if(this.error_image_code == true || this.check_phone == true){
                this.sending_flag == false;
                return;
            }

            // 向后端發送ajax請求,調用發送驗證碼方法
            var url = this.host + '/sms_codes/' + this.mobile + '/?image_code=' + this.image_code + '&image_code_id=' + this.image_code_id;
            axios.get(url, {
                responseType:'json'
            }).then(response=>{
                if(response.data.code == '0'){
                    // 倒計時60秒,60秒后允許用戶再次點擊發送短信驗證碼的按鈕
                    var num = 60;
                    // 設置一個計時器
                    var t = setInterval(() => {
                        if (num == 1) {
                            // 如果計時器到最后, 清除計時器對象
                            clearInterval(t);
                            // 將點擊獲取驗證碼的按鈕展示的文本回復成原始文本
                            this.sms_code_tip = '獲取短信驗證碼';
                            // 將點擊按鈕的onclick事件函數恢復回去
                            this.sending_flag = false;
                        } else {
                            num -= 1;
                            // 展示倒計時信息
                            this.sms_code_tip = num + '秒';
                        }
                    }, 1000, 60)
                }
                else{
                    if (response.data.code == '4001') {
                        this.error_image_code_message = response.data.errmsg;
                        this.error_image_code = true;
                    } else { // 4002
                        this.error_sms_code_message = response.data.errmsg;
                        this.error_sms_code = true;
                    }
                    this.generate_image_code();
                    this.sending_flag = false;
                }
            }).catch(error=>{
                console.log(error.response);
                this.sending_flag = false;
            })
        },
}

現在,點擊"發送短信驗證碼"后,開始60s倒計時,vue向服務器發送ajax請求,調用發送驗證碼方法,請求url為:

127.0.0.1:8000/sms_codes/電話號/?image_code=驗證碼內容&image_code_id=驗證碼唯一標識uuid

添加匹配這個請求的路由表:

url(r'^sms_codes/(?P<mobile>1[3-9]\d{9})/$', views.SmscodeView.as_view()),

添加相應的視圖函數:

class SmscodeView(View):
    def get(self, request, mobile):
        # 接收
        # 驗證
        # 處理
        # 獲取redis客戶端對象
        redis_cli = get_redis_connection('verify_code')
        redis_pl = redis_cli.pipeline()
        # 1.生成6位隨機數
        sms_code = '%06d' % random.randint(0, 999999)
        # 2.保存到redis,鍵為:sms_13327437752
        redis_pl.setex('sms_' + mobile, constants.SMS_CODE_EXPIRES, sms_code)
        # 3.存儲60s發送的標記
        redis_pl.setex('sms_flag_' + mobile, constants.SMS_CODE_FLAG_EXPIRES, 1)
        redis_pl.execute()
        # 響應
        return http.JsonResponse({
            'code': RETCODE.OK,
            'errmsg': 'OK'
        })

在配置文件里應有連接redis的配置:

CACHES = {
    "verify_code": {  # 驗證碼
        "BACKEND": "django_redis.cache.RedisCache",
        "LOCATION": "redis://127.0.0.1:6379/2",
        "OPTIONS": {
            "CLIENT_CLASS": "django_redis.client.DefaultClient",
        }
    }
}

源碼


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM