1.路由配置
2.對接第三方短信接口
詳細內容請點擊
3.視圖函數
def sms_view(request):"""短信驗證視圖邏輯1.獲取請求體的數據[phone]2.調用封裝的短信發送接口,實現發送短信"""data = json.loads(request.body)phone = data.get("phone")# 四位隨機數code = random.randint(1000, 9999)# 判斷:如果10分鐘之內發過了,則直接返回,否則再發短信key = f"sms_{phone}"redis_code = caches["sms"].get(key)if redis_code:# 10分鐘之內已經發送過了,直接返回,不能再發return JsonResponse({"code": 10107, "error": "10分鐘之內發一次"})# 調用短信接口,發送短信sms_api = YunTongXunAPI(**settings.SMS_CONFIG)sms_api.run(phone, code)# 存入redis控制短信發送頻率,有效期10分鐘caches["sms"].set(key, code, 600)# 存入redis控制驗證碼有效期,有效期10分鐘expire_key = f"sms_expire_{phone}"caches["sms"].set(expire_key, code, 600)return JsonResponse({"code": 200, "data": "短信發送成功"})
4.修改user/views.py代碼
新增短信驗證代碼:
def users(request):"""注冊功能邏輯視圖1.獲取請求體數據[request.body-字節串格式]2.數據校驗[不做]3.檢查用戶名是否存在3.1 已存在:直接返回錯誤代碼3.2 不存在:處理密碼,存入數據表4.生成token5.返回正確響應[看接口文檔]"""# 獲取請求體數據data = json.loads(request.body)uname = data.get('uname')password = data.get('password')phone = data.get('phone')email = data.get('email')# 獲取短信驗證碼verify = data.get("verify")expire_key = f"sms_expire_{phone}"redis_code = caches["sms"].get(expire_key)# 超過10分鐘if not redis_code:return JsonResponse({"code": 10108, "error": {"message": "已過期,請重新獲取驗證碼"}})# 10分鐘之內,驗證碼輸入錯誤if verify != str(redis_code):return JsonResponse({"code": 10109, "error": {"message": "驗證碼輸入有誤,請重新輸入驗證碼"}})# 數據庫查詢old_users = UserProfile.objects.filter(username=uname)# 用戶已存在if old_users:return JsonResponse({'code': 10100, 'error': 'The username is existed'})# 存入數據庫try:user = UserProfile.objects.create(username=uname,password=hashlib.md5(password.encode()).hexdigest(), # 密碼進行加密phone=phone,email=email)except Exception as e:print(e)return JsonResponse({'code': 10101, 'error': '--The username is existed'})# 簽發tokentoken = make_token(uname)# 二次開發 try一下# 發送激活郵件# 激活鏈接:http://XXX/active.html?code=xxx# code: base64(b"1016_zhaoliying")try:code_num = "%d" % random.randint(1000, 9999) # 生成隨機數code = "%s_%s" % (code_num, uname)code = base64.urlsafe_b64encode(code.encode()).decode()# 存儲隨機數key = "active_email_%s" % unamecaches["default"].set(key, code_num, 3 * 3600 * 24)# 激活鏈接verify_url = 'http://127.0.0.1:7070/dadashop/templates/active.html?code=' + code# 異步發送激活郵件async_send_active_mail.delay(email, verify_url)except Exception as e:print("send email error:", e)# 組織數據返回result = {'code': 200,'username': uname,'data': {'token': token},'carts_count': 0}return JsonResponse(result)