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)