状态保持
获取后端发送过来的用户数据,以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自带的服务器开启前端服务
注意:启动的时候必须进入到静态文件的路径 不然启动失败
- 进入到前端页面进行测试
- 查看最后返回的响应内容
- 查看数据库