在注册功能中集成短信验证码功能
接下来,我们把注册过程中一些注册信息(例如:短信验证码)和session缓存到redis数据库中。
安装django-redis。
pip install django-redis
在settings/dev.py配置中添加一下代码:
# 设置redis缓存
CACHES = {
# 默认缓存
"default": {
"BACKEND": "django_redis.cache.RedisCache",
# 项目上线时,需要调整这里的路径
"LOCATION": "redis://127.0.0.1:6379/0",
"OPTIONS": {
"CLIENT_CLASS": "django_redis.client.DefaultClient",
}
},
# 提供给xadmin或者admin的session存储
"session": {
"BACKEND": "django_redis.cache.RedisCache",
"LOCATION": "redis://127.0.0.1:6379/1",
"OPTIONS": {
"CLIENT_CLASS": "django_redis.client.DefaultClient",
}
},
# 提供存储短信验证码
"sms_code":{
"BACKEND": "django_redis.cache.RedisCache",
"LOCATION": "redis://127.0.0.1:6379/2",
"OPTIONS": {
"CLIENT_CLASS": "django_redis.client.DefaultClient",
}
}
}
# 设置xadmin用户登录时,登录信息session保存到redis
SESSION_ENGINE = "django.contrib.sessions.backends.cache"
SESSION_CACHE_ALIAS = "session"
关于django-redis 的使用,说明文档可见http://django-redis-chs.readthedocs.io/zh_CN/latest/
django-redis提供了get_redis_connection的方法,通过调用get_redis_connection方法传递redis的配置名称可获取到redis的连接对象,通过redis连接对象可以执行redis命令
https://redis-py.readthedocs.io/en/latest/
使用范例:
from django_redis import get_redis_connection
// 链接redis数据库
redis_conn = get_redis_connection("default")
使用云通讯发送短信
在登录后的平台上面获取一下信息:
ACCOUNT SID:8aaf0708697b6beb01699f4442911776
AUTH TOKEN : b4dea244f43a4e0f90e557f0a99c70fa
AppID(默认):8aaf0708697b6beb01699f4442e3177c
Rest URL(生产): app.cloopen.com:8883 [项目上线时使用真实短信发送服务器]
Rest URL(开发): sandboxapp.cloopen.com:8883 [项目开发时使用沙箱短信发送服务器]
找到sdkdemo进行下载
在开发过程中,为了节约发送短信的成本,可以把自己的或者同事的手机加入到测试号码中.
后端生成短信验证码
from renranapi.libs.yuntongxun.sms import CCP
import random
from django_redis import get_redis_connection
from renranapi.settings import constants
class SMSCodeAPIView(APIView):
"""
短信验证码
"""
def get(self, request, mobile):
"""
短信验证码
"""
# 生成短信验证码
sms_code = "%06d" % random.randint(0, 999999)
# 保存短信验证码与发送记录
redis_conn = get_redis_connection('sms_code')
# 使用redis提供的管道操作可以一次性执行多条redis命令
pl = redis_conn.pipeline()
pl.multi()
pl.setex("sms_%s" % mobile, constants.SMS_CODE_EXPIRE, sms_code) # 设置短信有效期为300s
pl.setex("sms_time_%s" % mobile, constants.SMS_CODE_INTERVAL, "_") # 设置发送短信间隔为60s
pl.execute()
# 发送短信验证码
ccp = CCP()
ccp.send_template_sms(mobile, [sms_code, ], constants.SMS_CODE_EXPIRE//60, settings.SMS.SMS_TEMPLATE_ID)
return Response({"message": "OK"}, status.HTTP_200_OK)
settings/constants.py代码:
# 短信有效使用时间
SMS_CODE_EXPIRE = 300
# 短信发送冷却时间
SMS_CODE_INTERVAL = 60
客户端发送注册信息和发送短信
<template>
<div class="sign">
<div class="logo"><a href="/"><img src="/static/image/nav-logo.png" alt="Logo"></a></div>
<div class="main">
<h4 class="title">
<div class="normal-title">
<router-link to="/user/login">登录</router-link>
<b>·</b>
<router-link id="js-sign-up-btn" class="active" to="/user/register">注册</router-link>
</div>
</h4>
<div class="js-sign-up-container">
<form class="new_user" id="new_user" action="" accept-charset="UTF-8" method="post">
<div class="input-prepend restyle">
<input placeholder="你的昵称" type="text" value="" v-model="nickname" id="user_nickname">
<i class="iconfont ic-user"></i>
</div>
<div class="input-prepend restyle no-radius js-normal">
<input placeholder="手机号" type="tel" v-model="mobile" id="user_mobile_number">
<i class="iconfont ic-phonenumber"></i>
</div>
<div class="input-prepend restyle no-radius security-up-code js-security-number" v-if="is_show_sms_code">
<input type="text" v-model="sms_code" id="sms_code" placeholder="手机验证码">
<i class="iconfont ic-verify"></i>
<a tabindex="-1" class="btn-up-resend js-send-code-button" href="javascript:void(0);" id="send_code" @click.prevent="send_sms">