我们通过云片网把验证码发送给用户,验证码是随机的,如果我们不把验证码保存起来,那么用户在拿到我们的验证码进行验证的时候我们就不知道验证码是否正确,所以要把验证码下来保存。
-
我们可以把全局变量定义在setting当中,但是这样我们重启Django变量就不存在了,而且随着验证码越来越多,内存消耗越来越大,
-
使用数据库的话虽然第一个问题可以解决,也可以验证时间是否过期,可以写一个定时任务,但是这样增加我们的代码复杂度,
-
因此就有了本文使用Redis,Redis是一个键值型数据库,我们在对Redis设置值的时候,可以给他设置一个过期时间,当这个时间过期的时候,Redis就会把过期的值自动清理,可以利用这个特性。Redis也被大量应用到web系统中解决我们的缓存问题中。
-
首先先在GitHub上面搜索Redis windows把压缩包下载下来
-
然后运行想应得文件,Redis之前有写过文章,大家可以去看看
-
这个窗口不要关,在打开另外一个窗口,启动测试一下
-
安装Python的redis驱动
pip install redis
-
在settings.py文件里面设置一下redis
# Redis设置
REDIS_HOST = '127.0.0.1'
REDIS_PORT = 6379
- 然后我们来书写我们的view逻辑,核心代码如下
class SendSmsView(View):
def post(self, request, *args, **kwargs):
re_dict = {}
# 取出表单里面的数据,详情看forms.py文件
send_sms_form = forms.DynamicLoginForm(request.POST)
if send_sms_form.is_valid():
# cleaned_data用于读取表单提交的值
mobile = send_sms_form.cleaned_data["mobile"]
# 随机生成动态验证码
code = generate_random(4, 0)
re_json = send_single_sms(yunpian_api, code=code, mobile=mobile)
if re_json['code'] == 0:
re_dict["status"] = "success"
# 验证码发送成功时用Redis来记录
# 必须要加上charset="utf-8'以及decode_responses=True,否则Redis保存的是布尔类型
r = redis.Redis(host=REDIS_HOST, port=REDIS_PORT, db=0, charset="utf8", decode_responses=True)
r.set(str(mobile), code)
# expire是用来设置验证码过期时间的
r.expire(str(mobile), 60 * 5) # 设置验证码五分钟过期
else:
re_dict["msg"] = "msg"
else:
# items将错误信息转化列表
# from.errors其实就是一个字典, 可以利用for error in form.errors.values,
# 或者for key, value in form.errors遍历得到其中的数据
for key, value in send_sms_form.errors.items():
re_dict[key] = value[0]
# 他会将我们的dict转成json传给我们的浏览器
return JsonResponse(re_dict )
因为这里用到了form.py文件,所以这里给出
from django import forms
from captcha.fields import CaptchaField
class LoginForm(forms.Form):
username = forms.CharField(required=True, min_length=2)
password = forms.CharField(required=True, min_length=3)
class DynamicLoginForm(forms.Form):
mobile = forms.CharField(required=True, max_length=11, min_length=11)
captcha = CaptchaField()
接收验证码的表单的login.html代码还没有完善好,后续给出