驗證碼登錄功能(接口)


一、驗證碼登錄功能(接口)

1、后台

 

 

 

 

 

 

 

 將驗證碼校驗 封裝成方法:如下圖的  標紅處

 

 總的 

# 自定義 手機驗證碼登錄 序列化類
import re
from django.core.cache import cache
class MobileLoginViewSet(serializers.ModelSerializer):
    # 覆蓋數據庫中的mobile字段
    mobile = serializers.CharField(required=True,write_only=True)
    # code 是不入庫的。所以要這這個序列化類中 寫code字段,進行序列化
    # required=True表示:。。。 write_only=True 表示 :前端到后端
    # 自定義 code字段
    code = serializers.CharField(min_length=4,max_length=4,required=True,write_only=True)
    class Meta:
        model = models.User
        fields = ( 'id', 'username','icon','mobile','code')
        # id username icon 的校驗規則
        extra_kwargs = {
            'id': {
                'read_only': True,
            },
            'username': {
                'read_only': True,
            },
            'icon': {
                'read_only': True,
            },
        }

    # 局部鈎子 用來校驗  mobile字段(手機號) 的格式是否正確
    def validate_mobile(self, value):
        if not re.match(r'^1[3-9][0-9]{9}$',value):
            raise exceptions.ValidationError('mobile field error')
        return value

    # 用全局鈎子 來校驗 用戶提交給后端的驗證碼是否 過期了
    def validate(self, attrs):
        mobile=self._check_code(attrs)
        user = self._get_user(mobile)  # 調用_get_user()方法 得到user
        token = self._get_token(user)  # user簽發token
        self.context['token'] = token  # token用context屬性 攜帶給視圖類。
        self.context['user'] = user  # 把 user給外界 將登錄用戶對象直接傳給視圖
        return attrs
    def _check_code(self,attrs):
        mobile = attrs.get('mobile')
        code = attrs.pop('code')  # pop表示彈出列表/字典里 最后一個元素。
        # 這里用pop是因為 code 不往數據庫中存呀
        old_code = cache.get(settings.SMS_CACHE_KEY % {'mobile': mobile})  # SMS_CACHE_KEY 是暫存在django內嵌的緩存數據庫的 驗證碼
        if code != old_code:
            raise exceptions.ValidationError({'code': 'double code error'})
        else:
            # 驗證碼的時效性:一旦驗證碼校驗通過,就代表該驗證碼已使用,需要立即失效(用來測試的)
            # cache.set(settings.SMS_CACHE_KEY % {'mobile': mobile}, '', -1)  # -1或0表示立即失效
pass
return mobile def _get_user(self, mobile): # 拿到用戶登錄時 輸入的用戶信息(手機號) try: return models.User.objects.get(mobile=mobile) # 在數據庫中 拿出user對象 except: raise exceptions.ValidationError({'mobile': 'user not exist'}) def _get_token(self, user): # user 是對象 # 從jwt認證 插件中的 序列化組件 中 導入 jwt_payload_handler,jwt_encode_handler from rest_framework_jwt.serializers import jwt_payload_handler, jwt_encode_handler payload = jwt_payload_handler(user) # user 是對象 token = jwt_encode_handler(payload) return token

 二、前台

js 中正則的 語法:

  ‘字符串’.match(/正則語法/)

 

 

 

 

 

 

 

 

 登錄按鈕的 點擊事件。

注意:下面的$axios的data 錯了,應該寫成params 因為:get請求用params

修改后台 頻率文件

 


免責聲明!

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



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