ACCOUNT SID:8a216da863f8e6c20164139687e80c1b
AUTH TOKEN : 6dd01b2b60104b3dbc88b2b74158bac6
AppID(默认):8aaf0708697b6beb01699f4442e3177c
from django.conf import settings
from .SmsSDK SmsSDK
json
accId = settings.SMS_INFO.get('ACCID')
accToken = settings.SMS_INFO.get(ACCTOKEN)
appId = settings.SMS_INFO.get(APPID)
def send_message(tid,mobile,datas):
sdk = SmsSDK(accId,accToken,appId)
resp = sdk.sendMessage(tid,datas)
resp = json.loads(resp)
print(resp)
return resp.get(statusCode') == 000000'
SMS_INFO = {
':8a216da8754a45d5017563ac8e8406ff,a2054f169cbf42c8b9ef2984419079da8a216da8754a45d5017563ac8f910705views.py
# views.py
'''todo 发送验证码'''
logging
logger = logging.getLogger(django)
from lyapi.libs.ronglian_sms_sdk.sms send_message
class GetSMSCodeView(APIView):
get():
......
发送验证码
ret = send_message(settings.SMS_INFO.get(TID),phone,(sms_code,constants.SMS_CODE_EXPIRE_TIME))
if not ret:
logger.error({}手机号短信发送失败.format(phone))
return Response({msg短信发送失败,请联系管理员!!'},status=status.HTTP_500_INTERNAL_SERVER_ERROR)
': ok})
3.drf后端接口测试
访问users/sms_code/13015409856,可得到msg:ok 并且手机会接受到验证码信息

2.前端点击获取验证码效果
1.在register.vue中给获取验证码按钮绑定个点击事件
<!-- html -->
<div>
input v-model = "sms" type="text" placeholder="输入验证码" class="user" style="width: 62%"button style="width: 34%;height: 41px;" @click="getSmsCode">{{ btn_msg }}</button>
>
// js
<script>
export default {
name: 'Register'return {
......
interval_time:60, 倒计时时间
btn_msg:'点击获取验证码',1)"> 按钮上面的信息
flag:false 判断定时器是否已经开启
}
},created(){
},methods:{
......
getSmsCode(){
this.$axios.get(`${this.$settings.Host}/users/sms_code/${this.mobile}/`)
.then(()=>{
计时器
this.flag = setInterval(()=>{
if(this.interval_time > 0){
this.interval_time--;
this.btn_msg=`${this.interval_time}秒后重新获取`;
}else{
this.interval_time=60this.btn_msg='点击发送验证码';
clearInterval(.flag);
this.flag=false;
}
},1000)
})
.catch(()=>{
})
}
},};
</script>
这个时候 我们在注册页面点击获取验证码按钮 手机上就可以收到短信了
2.效果:按钮变为不可点击
未获取验证码时:按钮显示点击获取验证码 且按钮是可点击的
?获取验证码时,按钮显示倒计时,并且倒计时时按钮不可点击
-->
="getSmsCode" :disabled="this.flag" {
validateResult:'点击获取验证码'`)
.then((res)=>{
){
;
.interval_time}秒后重新获取`;
this.disabled = true; 将按钮设置为不可点击
}{
;
clearInterval(.flag);
将按钮设置为可点击
}
},1)">)
})
.catch((error)=>{
})
3.效果:前端显示:60s已经发过了,别瞎搞
register.vue
register.vue
getSmsCode(){ `)
......
.{
this.$message.error(error.response.data.msg); 打印错误信息
})
3.注册后端接口实现
1.后端序列化器对验证码的校验
serializers.py
serializers.py
from rest_framework serializers
from django_redis get_redis_connection
......
todo 校验验证码
validate(self,attrs):
......
conn = get_redis_connection(sms_code') 获取redis所存放验证码的那个库对象
ret = conn.get(mobile_%s' % (phone_number)) 获取到手机号对应的验证码
not ret: 如果验证码不存在
raise serializers.ValidationError(验证码已失效)
if ret.decode() != sms: 如果验证码不对
验证码输入错误)
attrs
......
2.当用户注册成功后,后端应该返回给前端一个真实的token值
create(self,validated_data):
......
通过jwt生成一个真实的token值返回给前端
payload = jwt_payload_handler(user)
token = jwt_encode_handler(payload)
user.token = token
return user
<script> {
sms:""60,1)"> /倒计时时间
btn_msg:'点击获取验证码'false,1)"> 判断定时是否已经开启
}
},methods:{
......
registerHandler(){
this.$axios.post(`${this.$settings.Host}/users/register/`,{
sms:.sms,phone:.mobile,password:.password,r_password:.r_password,}).then((res)=>{
注册成功 将id token username存储到前端 并跳转到首页
sessionStorage.token = res.data.token;
sessionStorage.username = res.data.username;
sessionStorage.id = res.data.id;
this.$router.push('/') 跳转到首页
}). 注册失败 打印错误信息
console.log(error.response);
})
},getSmsCode(){ 点击了获取验证码之后 按钮变为不可点击
}else{ 倒计时停止 允许用户发送短信
}
},1)">.$message.error(error.response.data.msg);
})
}
},};
</script>
文件结构目录
lyapi/
├── mycelery/
├── config.py 配置文件
├── __init__.py
├── main.py 主程序
└── sms/
└── tasks.py 任务的文件,名称必须是这个!!!
main.py
from celery Celery
os
os.environ.setdefault(DJANGO_SETTINGS_MODULE',lyapi.settings.dev django
django.setup()
app = Celery()
app.config_from_object(mycelery.config)
app.autodiscover_tasks([mycelery.smsconfig.py
config.py
任务队列的链接地址(变量名必须叫这个)
broker_url = redis://127.0.0.1:6379/14'
结果队列的链接地址(变量名必须叫这个)
result_backend = redis://127.0.0.1:6379/15tasks.py
tasks.py
from mycelery.main app
from lyapi.settings constants
)
@app.task(name=smsCode sms_codes(phone,sms_code):
ret2 = send_message(settings.SMS_INFO.get('),constants.SMS_CODE_EXPIRE_TIME // 60))
ret2:
logger.error(.format(phone))
return 短信发送成功啦'
views.py
发送验证码
from mycelery.sms.tasks sms_code
sms_code.delay(phone,sms_code)
'})
(编辑:李大同)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!