python实训第二十一天----------短信验证码的功能实现

1.发送短信验证码逻辑分析

在这里插入图片描述

2. 发送短信验证码接口设计

  • 获取短信验证码属于获取资源,所以请求方法设计为 GET
  • 为了省掉单独验证手机号格式,所以把手机号作为路径参数提交
  • 在这里插入图片描述
    P<mobile> 是取了一名字,后面可以使用这个mobile获取传过来的参数

2.2 请求参数:路径参数和查询字符串

在这里插入图片描述
查询字符串格式:是跟在url路径后面的
?image_code=1234&uuid=kalaslkcnalfna

2.3 响应结果:JSON

在这里插入图片描述

调用容联云通信:短信平台使用

https://www.yuntongxun.com/
注册用户,登录用户

创建应用
在这里插入图片描述
在这里插入图片描述
python测试帮助:

http://doc.yuntongxun.com/p/5f029ae7a80948a1006e776e
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

views.py里的文件

注意 random引入的是模块 random, 而不是import 。。。from 。。。
从redis里取出的值是 byte类型的字节码,需要转换成字符串,使用decode()转化

import random
import uuid


from django.http import HttpRequest, HttpResponse, HttpResponseForbidden, JsonResponse
from django.shortcuts import render

# Create your views here.
from django.views import View
from django_redis import get_redis_connection
from redis import StrictRedis

from woniumall.libs.captcha.captcha import captcha
from woniumall.libs.ronglian_sms_sdk.Sms import send_sms_code
from woniumall.utils import constants
from woniumall.utils.response_code import RETCODE

class SmsCodeView(View):
    def get(self, request: HttpRequest, mobile):
        # 1.接收数据
        image_code = request.GET.get("image_code")
        uuid = request.GET.get("uuid")
        # 校验数据
        if not all([image_code, uuid]):
            return HttpResponseForbidden("缺少必要数据")
        # 为了避免用户使用图形验证码恶意测试,每个图形验证码只能使用一次,后端提取了图形验证码后,立即删除图形验证码
        redis: StrictRedis = get_redis_connection("image_code")
        image_code_redis = redis.get(uuid)
        # 删除图形验证码
        redis.delete(uuid)

        # 比较图形验证码
        # redis里的code是字节码 要转化成字符串
        if image_code.lower() != image_code_redis.lower().decode():
            return JsonResponse({"code":RETCODE.IMAGECODEERR,"errmsg":"图形验证码错误"})

        # 产生短信验证码
        # 产生6位
        sms_code = random.randint(0, 1000000)
        # 产生一个数字 9 ,可以格式化为000009
        sms_code = "{:0>6d}".format(sms_code)

        # 保存到redis
        redis: StrictRedis = get_redis_connection("sms_code")
        redis.set(mobile, sms_code, ex=constants.sms_code_expire)

        # 发送短信验证码
        if send_sms_code([mobile], sms_code):
            # 返回响应
            return JsonResponse({"code": 0, "errmsg": "ok"})
        else:
            return JsonResponse({"code": RETCODE.SMSCODERR, "errmsg": "短信验证码发送失败"})

urls.py里的代码:
注意r " 后面不要跟上 /

from django.urls import re_path

from verifications import views

urlpatterns = [

    re_path(r"image_codes/(?P<uuid>[\w-]+)/", views.ImageCodeView.as_view()),
    re_path(r"sms_codes/(?P<mobile>1[3-9]\d{9})/", views.SmsCodeView.as_view()),
]

短信验证码的业务逻辑总结

views.py的代码实现流程,自己的体会:

用户从注册页面填写 手机号,图形验证码,后端接收到手机号,图形验证码 和 UUID
然后我们在后端首先是用GET 请求的方法的get得到数据
我们再判断数据是否齐全,不齐全的话返回一个错误
手机号和UUID齐全的话,我们就应该开始对UUID进行验证,即是验证图形验证码输入是否正确
在设置图形验证码的时候,我们已经将图形验证码的UUID和image_code存在redis 的 2号仓库了
这时,我就需要连接redis 缓存,然后取出UUID下对应的验证码,这里是用image_code_redis存起来。为了保证数据的安全性,我们会将取出的UUID删除,即是删除图形验证码
然后我们就可以将GET请求里的验证码和我们从缓存里取出的验证码进行比较了,如果比较成功,那么我们就可以给用户的手机号发送短信验证码。
值得说明的是:这里比较短信验证码,从redis里取出的数据是字节码的文件,我们需要转化成字符串才能进行比较,还有为了不区分大小写,我们统一规定为比较小写的字符串。
在这里插入图片描述
如果比较成功,那么我们就发送短信验证码,这里的字符串是6位,随机生成的,我们这里使用的是randint后面跟的是一个范围,范围里的数字可能产生5,这个时候我们希望是000005,所以需要将产生的随机数进行格式化
在这里插入图片描述
然后我们将产生的验证码存入到新的redis 3 号库中,我们又需要在settings中添加一个redis数据库
在这里插入图片描述

还要注意一个事情:前端的代码,在运行之后修改,重新启动服务器是没有更改前端的代码的,需要清除,不清除的话,还是之前的未修改的
在这里插入图片描述

在这里插入图片描述

短信验证码前端实现

register.js

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

你在狗叫什么、

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值