一、驗證碼登錄功能(接口)
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
修改后台 頻率文件