Django項目用戶注冊功能(完)

一副砍、注冊功能(完)

1.業(yè)務流程分析

  • 對校驗進行校驗
    • 校驗用戶名
    • 校驗密碼
    • 校驗手機號碼
    • 校驗短信驗證碼
  • 新建數據庫記錄

2浴滴、接口設計

2.1 接口說明

條目 說明
請求方法 POST
url定義 /user/register/
參數格式 表單(form)

2.2 參數說明

參數名字 類型 是否必須 描述
username 字符串 用戶輸入的用戶名
password 字符串 用戶輸入的密碼
password_repeat 字符串 用戶輸入的重復(確認)密碼
monile 字符串 用戶輸入的手機號碼
sms_code 字符串 用戶輸入的短信驗證碼

注意每個表單頁面都要自己加 {% csrf_token %}
2.3 返回的結果:
返回的結果:

{
      "errno":"0",
      "errmsg":"恭喜您,注冊成功~谒养!",
}

3.編寫代碼

既然是框架就要符合框架的邏輯滔岳,視圖的views 只調用相應的模板即可驻仅,校驗在forms 表單校驗,因此 在 user 下面新建forms.py

user_views 新增代碼

......
from .forms import RegisterForm
from utils.res_code import json_response,Code
from .models import User


# 調用模板 檢驗數據 創(chuàng)建數據庫記錄
    def post(self,request):
        # 1. 校驗數據
        form = RegisterForm(request.POST)
        if form.is_valid():
            # 2. 創(chuàng)建數據庫記錄
            username = form.cleaned_data.get('username')
            password = form.cleaned_data.get('password')
            mobile = form.cleaned_data.get('mobile')
            User.objects.create_user(username=username,password=password,mobile=mobile)
            return json_response(errmsg='恭喜您注冊成功摆舟,請愉快玩耍~')
        else:
            # 將失敗信息進行拼接
            err_msg_list = []
            for item in form.errors.values():
                # item 也是一個列表亥曹,所以把錯誤信息放在item的第一位
                err_msg_list.append(item[0])
            err_msg_str = '/'.join(err_msg_list)
            return json_response(errno=Code.PARAMERR, errmsg=err_msg_str)

user_forms 代碼:

from django import forms
from django_redis import get_redis_connection


from verification import constants
from .models import User
from verification.forms import mobile_validator


class RegisterForm(forms.Form):
    '''
    用戶注冊表單
    '''
    # 獲取字段內容
    username = forms.CharField(label='用戶名',max_length=20,min_length=5,error_messages={
        'max_length':'用戶名長度要小于20',
        'min_length':'用戶名長度至少5個字符',
        'required':'用戶名不能為空',
    })
    password = forms.CharField(label='密碼', max_length=20, min_length=6, error_messages={
        'max_length': '密碼長度要小于20',
        'min_length': '密碼長度至少6個字符',
        'required': '密碼不能為空',
    })
    password_repeat = forms.CharField(label='重復密碼', max_length=20, min_length=6, error_messages={
        'max_length': '密碼長度要小于20',
        'min_length': '密碼長度至少6個字符',
        'required': '密碼不能為空',
    })
    mobile = forms.CharField(label='手機號碼', max_length=11, min_length=11,validators=[mobile_validator,], error_messages={
        'max_length': '請輸入正確的11位手機號碼',
        'min_length': '請輸入正確的11位手機號碼',
        'required': '手機號碼不能為空',
    })
    sms_code = forms.CharField(label='短信驗證碼', max_length=constants.SMS_CODE_LENGTH, min_length=constants.SMS_CODE_LENGTH, error_messages={
        'max_length': '短信驗證碼長度不正確',
        'min_length': '短信驗證碼長度不正確',
        'required': '短信驗證碼不能為空',
    })

    ##校驗從這里開始
    def clean_username(self):
        '''
        校驗用戶名
        :return:
        '''
        username = self.cleaned_data.get('username')
        if User.objects.filter(username=username).exists():
            raise forms.ValidationError('用戶名已注冊,請重新輸入')
        return username

    def clean_mobile(self):
        '''
        校驗手機號碼
        :return:
        '''
        mobile = self.cleaned_data.get('mobile')
        if User.objects.filter(mobile=mobile).exists():
            raise forms.ValidationError('手機號碼已注冊恨诱,請重新輸入')
        return mobile

    def clean(self):
        '''
        校驗密碼(聯合校驗)
        :return:
        '''
        clean_data = super().clean()
        password = clean_data.get('password')
        password_repeat = clean_data.get('password_repeat')

        ##################################
        if password != password_repeat:
            raise forms.ValidationError('兩次輸入的密碼不一致媳瞪,請重新輸入')
        ######################################
        #  如果上面這個判斷驗證不通過,下面代碼不會執(zhí)行
        ###################################
        ## 校驗短信驗證碼
        sms_code = clean_data.get('sms_code')
        mobile = clean_data.get('mobile')

        redis_conn = get_redis_connection(alias='verify_code')
        real_code =  redis_conn.get('sms_text_%s'%(mobile))
        print(real_code,'   ',sms_code)
        if (not real_code) or ( real_code.decode('utf-8') != sms_code ) :
            raise forms.ValidationError('短信驗證碼錯誤')


這里注意一點: clean_字段名 跟 clean 的區(qū)別
clean_字段名: 你寫多少就執(zhí)行多少 記得要return 字段名
clean: 只要有一部分不通過就不會往下執(zhí)行

4. 前端部分

// 6. 注冊
    let $submitBtn = $('.register-btn');
    $submitBtn.click((e)=>{
        //阻止默認提交
        e.preventDefault();
        //檢查各參數狀態(tài)
        if (!isUsernameReady) {
            fnCheckUsername();
            return
        }
        if (!isPasswordReady){
            fnCheckPassword();
            return
        }
        if (!isMobileReady){
            fnCheckMobile();
            return
        }

        // 檢驗短信驗證碼
        let sSmsCode = $('input[name="sms_captcha"]').val();
        if (sSmsCode === ''){
            message.showError('短信驗證碼不能為空照宝,請重新輸入');
            return
        }
        if (!(/^\d{4}$/).test(sSmsCode)){
            message.showError('短信驗證碼長度不正確蛇受,必須是4位數字');
            return
        }

        // 發(fā)送ajax
        $
            .ajax({
                url:'/user/register/',
                type:'POST',
                data:{
                    mobile : $mobile.val(),
                    username:$username.val(),
                    password:$('input[name="password"]').val(),
                    password_repeat:$passwordRepeat.val(),
                    sms_code:sSmsCode,
                },
                dataType:'json',
            })
            .done((res)=>{
                if(res.errno === '0'){
                    message.showSuccess(res.errmsg);
                    //跳轉的登錄頁面
                    setTimeout(()=>{
                        window.location.href='/user/login/'
                    },1500)

                }else {
                    //注冊失敗
                    message.showError(res.errmsg);
                }
            })
            .fail((res)=>{
                message.showError('服務器連接超時,請重試');
            })
    })

5.短信驗證碼

在 verification_views 之前留下的接口處增加以下代碼

# 新增導入包
from utils.yuntongxun.sms import CCP
#發(fā)送的代碼
ccp = CCP()
            try:
                res = ccp.send_template_sms(mobile, [sms_code, constants.SMS_CODE_EXPIRES], "1")
                if res == 0:
                    logger.info('發(fā)送短信驗證碼[正常][mobile: %s sms_code: %s]' % (mobile, sms_code))
                else:
                    logger.error('發(fā)送短信驗證碼[失敗][moblie: %s sms_code: %s]' % (mobile, sms_code))
                    return json_response(errno=Code.SMSFAIL, errmsg=error_map[Code.SMSFAIL])
            except Exception as e:
                logger.error('發(fā)送短信驗證碼[異常][mobile: %s message: %s]' % (mobile, e))
                return json_response(errno=Code.SMSERROR, errmsg=error_map[Code.SMSERROR])

附上效果圖


01.jpg
02.jpg
03.jpg
04.jpg

最后的最后

 $ git add .
 $ git commit -m 'update projects'
 $ git push origin master
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末厕鹃,一起剝皮案震驚了整個濱河市兢仰,隨后出現的幾起案子,更是在濱河造成了極大的恐慌熊响,老刑警劉巖旨别,帶你破解...
    沈念sama閱讀 221,406評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現場離奇詭異汗茄,居然都是意外死亡穗椅,警方通過查閱死者的電腦和手機徙邻,發(fā)現死者居然都...
    沈念sama閱讀 94,395評論 3 398
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人获茬,你說我怎么就攤上這事∏从牵” “怎么了哎垦?”我有些...
    開封第一講書人閱讀 167,815評論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長嫂侍。 經常有香客問我儿捧,道長,這世上最難降的妖魔是什么挑宠? 我笑而不...
    開封第一講書人閱讀 59,537評論 1 296
  • 正文 為了忘掉前任菲盾,我火速辦了婚禮,結果婚禮上各淀,老公的妹妹穿的比我還像新娘懒鉴。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 68,536評論 6 397
  • 文/花漫 我一把揭開白布临谱。 她就那樣靜靜地躺著璃俗,像睡著了一般。 火紅的嫁衣襯著肌膚如雪悉默。 梳的紋絲不亂的頭發(fā)上城豁,一...
    開封第一講書人閱讀 52,184評論 1 308
  • 那天,我揣著相機與錄音麦牺,去河邊找鬼钮蛛。 笑死,一個胖子當著我的面吹牛剖膳,可吹牛的內容都是我干的魏颓。 我是一名探鬼主播,決...
    沈念sama閱讀 40,776評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼吱晒,長吁一口氣:“原來是場噩夢啊……” “哼甸饱!你這毒婦竟也來了?” 一聲冷哼從身側響起仑濒,我...
    開封第一講書人閱讀 39,668評論 0 276
  • 序言:老撾萬榮一對情侶失蹤叹话,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后墩瞳,有當地人在樹林里發(fā)現了一具尸體驼壶,經...
    沈念sama閱讀 46,212評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 38,299評論 3 340
  • 正文 我和宋清朗相戀三年喉酌,在試婚紗的時候發(fā)現自己被綠了热凹。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,438評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡泪电,死狀恐怖般妙,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情相速,我是刑警寧澤碟渺,帶...
    沈念sama閱讀 36,128評論 5 349
  • 正文 年R本政府宣布,位于F島的核電站突诬,受9級特大地震影響苫拍,放射性物質發(fā)生泄漏。R本人自食惡果不足惜旺隙,卻給世界環(huán)境...
    茶點故事閱讀 41,807評論 3 333
  • 文/蒙蒙 一绒极、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧催束,春花似錦、人聲如沸伏社。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,279評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至速妖,卻和暖如春高蜂,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背罕容。 一陣腳步聲響...
    開封第一講書人閱讀 33,395評論 1 272
  • 我被黑心中介騙來泰國打工备恤, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人锦秒。 一個月前我還...
    沈念sama閱讀 48,827評論 3 376
  • 正文 我出身青樓露泊,卻偏偏與公主長得像,于是被迫代替她去往敵國和親旅择。 傳聞我的和親對象是個殘疾皇子惭笑,可洞房花燭夜當晚...
    茶點故事閱讀 45,446評論 2 359