Django项目 ----用户状态保持以及发送短信验证码

状态保持

获取后端发送过来的用户数据,以cookie的形式存入到浏览器中,当实现用户登录的功能的时候,可以直接获取该数据使用。直接利用Django框架中的login属性进行获取

在这里插入图片描述

短信验证码

  • 测试平台:容联云
  • 下载容联云与Python交互的包:pip install ronglian_sms_sdk
  • 获取到skd和发送短信的文件:点击该链接直接获取
步骤

1.将下载好的文件放入到自己的工程目录中
在这里插入图片描述
2.进入到容联云的官网中登录,根据下载的文件进行填写自己的信息
在这里插入图片描述
3.填写完善之后直接运行文件是否发送成功
在这里插入图片描述
上面的步骤只是为了测试,方便接下来的开发 接下来直接上操作

发短信 单利类

  • 创建包sms和里面的文件sms_util.py
    在这里插入图片描述
  • sms_util.py里面写用来 发短信的单例类
import json

from ronglian_sms_sdk import SmsSDK

accId = '****************************'
accToken = '****************************'
appId = '****************************'

class  SmsUtil:
    def __new__(cls, *args, **kwargs):
        # 是否有_instance属性
        if not hasattr(SmsUtil,'_instance'):
            cls._instance = super().__new__(cls, *args, **kwargs)
            # 创建一个SmsDK对象 这里执行一次 所以SmsSDK对象只有一个
            cls._instance.sms_sdk = SmsSDK(accId,accToken,appId)

        return cls._instance


    def send_message(self,mobile='*************',datas=('123456','2'),tid = '1'):

        resp = self.sms_sdk.sendMessage(tid, mobile, datas)
        resp_dict = json.loads(resp)
        if resp_dict.get('statusCode') == '000000':
            print('发送短信成功')
            return 0
        else:
            print('发送短信失败')
            return 1

SmsUtil().send_message()

发送短信的视图

逻辑步骤:
	1.获取参数
	2.验证参数,判断参数是否存在
	3.验证图片验证码
		3.1根据uuid取出保存在Redis里的验证码
		3.2判断是否过有效期
		3.3用户发送过来的进行对比,注意发送过来的是二进制的数据需要decode
	4.生成短信验证码
	5.保存短信验证码到Redis
	6.发送短信
	7.返回响应
# 创建视图并且注册
class SmsCodeView(View):
    def get(self, request, mobile):
        # 步骤
        # 1 获取参数
        image_code = request.GET.get("image_code")  # 图片验证码
        uuid = request.GET.get("image_code_id")  # uuid

        # 2 验证参数  参数是否存在
        if not all([image_code, uuid]):
            return JsonResponse({'code': 400, 'errmsg': "参数不全"})

        # 3 验证图片验证码
        # 3.1根据uuid取出保存在redis里的验证码
        redis_cli = get_redis_connection("code")
        redis_image_code = redis_cli.get(uuid)
        # 删除图片验证码
        try:
            redis_cli.delete(uuid)
        except Exception as e:
            print("删除图片验证码")


        # 3.2判断是否过有效期
        if redis_image_code is None:
            return JsonResponse({'code': 400, 'errmsg': "图片验证码过期"})

        # 3.3用户发过来的对比 redis_image_code是二进制 需要decode
        if redis_image_code.decode().lower() != image_code.lower():
            return JsonResponse({'code': 400, 'errmsg': "图片验证码输入错误"})
    
        # 4 生成短信验证码
        # 0-999999
        from random import randint
        # "%06d" 让数字保存6位  如果不够 左侧补0
        sms_code = "%06d" % randint(0, 999999)
        print("sms_code", sms_code)

        # 5 保存短信验证码 到redis  key的格式 sms_手机号
        redis_cli.setex("sms_%s" % mobile, 300, sms_code)
        # 6 发送短信
        from utils.sms.sms_util import SmsUtil
        SmsUtil().send_message(mobile, (sms_code, 5))
        # 7 返回响应
        return JsonResponse({'code': 0, 'errmsg': "ok"})

防止频繁发送验证码

  • 存放一个flag到Redis中

1.获取手机号的值
2.如果值不存在就返回错误的响应 ‘过于频繁发送’
3.保存手机号的值

# 防止发送短信频繁
        # 1 获取 send_flag_手机号 的值
        send_flag = redis_cli.get('send_flag_%s' % mobile)
        # 2 如果值存在 返回错误响应 过于频繁发送
        if send_flag:
            return JsonResponse({'code': 400, "errmsg": "过于频繁发送"})

pipline的使用

原因
  • 如果Redis服务端需要同时处理多个请求,加上网络延迟,那么服务端利用率不高,效率降低
使用pipline解决问题
  • 1.创建Redis管道 2.将Redis请求添加到队列 3.执行请求
        # 创建Redis管道
        pl = redis_cli.pipeline()
        # 将Redis请求添加到队列中 # 3 保存'send_flag_手机号'的值
        pl.setex('sms_%s' % mobile, 300, sms_code)
        # 5 保存短信验证码到redis
        pl.setex('send_flag_%s' % mobile, 60, 1)
        # 执行请求
        pl.execute()

演示结果

  • 使用python manage.py runserver 0.0.0.0:8080 域名和端口根据自己的运行 开启后端服务器
    在这里插入图片描述
  • 使用Python自带的服务器开启前端服务 注意:启动的时候必须进入到静态文件的路径 不然启动失败
    在这里插入图片描述
  • 进入到前端页面进行测试

在这里插入图片描述

  • 查看最后返回的响应内容
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
  • 查看数据库

在这里插入图片描述

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值