day80:luffy:短信sdk接入&点击获取验证码&注册功能的实现&Celery实现短信发送功能
目录
1.短信sdk接入
1.准备工作
1.下载云通讯相关的文件 https://github.com/cloopen/python-sms-sdk
2.在lyapi目录下创建一个lib文件夹,将ronglian_sms_sdk文件夹放入lib文件夹中
3.文件夹下的目录结构如图所示

4.登录 https://www.yuntongxun.com/ 获取一些相关信息
ACCOUNT SID:8a216da863f8e6c20164139687e80c1b
AUTH TOKEN : 6dd01b2b60104b3dbc88b2b74158bac6
AppID(默认):8aaf0708697b6beb01699f4442e3177c
2.使用容联云通讯发送短信
sms.py
from django.conf import settings
from .SmsSDK import SmsSDK
import 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, mobile, datas)
resp = json.loads(resp)
print(resp)
return resp.get('statusCode') == '000000'
dev.py
SMS_INFO = {
'ACCID':'8a216da8754a45d5017563ac8e8406ff',
'ACCTOKEN':'a2054f169cbf42c8b9ef2984419079da',
'APPID':'8a216da8754a45d5017563ac8f910705',
}
views.py
# views.py
'''todo 发送验证码'''
import logging
logger = logging.getLogger('django')
from lyapi.libs.ronglian_sms_sdk.sms import send_message
from django.conf import settings
class GetSMSCodeView(APIView):
def 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) return Response({'msg': '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>
</div>
// js
<script>
export default {
name: 'Register',
data(){
return {
......
interval_time:60, // 倒计时时间
btn_msg:'点击获取验证码', // 按钮上面的信息
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=60;
this.btn_msg='点击发送验证码';
clearInterval(this.flag);
this.flag=false;
}
},1000)
})
.catch(()=>{ }) } }, };
</script>
这个时候 我们在注册页面点击获取验证码按钮 手机上就可以收到短信了
2.效果:按钮变为不可点击
未获取验证码时:按钮显示点击获取验证码 且按钮是可点击的
获取验证码时,按钮显示倒计时,并且倒计时时按钮不可点击
<!-- html -->
<div>
<input v-model = "sms" type="text" placeholder="输入验证码" class="user" style="width: 62%">
<button style="width: 34%;height: 41px;" @click="getSmsCode" :disabled="this.flag">{{ btn_msg }}</button>
</div>
// js
<script>
export default {
name: 'Register',
data(){
return {
validateResult:false,
interval_time:60,
btn_msg:'点击获取验证码',
flag:false,
}
},
created(){
},
methods:{
......
getSmsCode(){
this.$axios.get(`${this.$settings.Host}/users/sms_code/${this.mobile}/`)
.then((res)=>{
this.flag = setInterval(()=>{
if(this.interval_time > 0){
this.interval_time--;
this.btn_msg=`${this.interval_time}秒后重新获取`;
this.disabled = true; // 将按钮设置为不可点击
}else{
this.interval_time=60;
this.btn_msg='点击发送验证码';
clearInterval(this.flag);
this.flag=false;
this.disabled = false // 将按钮设置为可点击
}
},1000)
})
.catch((error)=>{ })
3.效果:前端显示:60s已经发过了,别瞎搞
register.vue
// register.vue
getSmsCode(){ this.$axios.get(`${this.$settings.Host}/users/sms_code/${this.mobile}/`)
......
.catch((error)=>{
this.$message.error(error.response.data.msg); // 打印错误信息
})
3.注册后端接口实现
1.后端序列化器对验证码的校验
serializers.py
# serializers.py
from rest_framework import serializers
from django_redis import get_redis_connection
......
# todo 校验验证码
def validate(self, attrs):
......
conn = get_redis_connection('sms_code') # 获取redis所存放验证码的那个库对象
ret = conn.get('mobile_%s' % (phone_number)) # 获取到手机号对应的验证码
if not ret: # 如果验证码不存在
raise serializers.ValidationError('验证码已失效')
if ret.decode() != sms: # 如果验证码不对
raise serializers.ValidationError('验证码输入错误') return attrs ......
2.当用户注册成功后,后端应该返回给前端一个真实的token值
serializers.py
# serializers.py
def create(self, validated_data): ......
# 通过jwt生成一个真实的token值返回给前端
payload = jwt_payload_handler(user)
token = jwt_encode_handler(payload)
user.token = token return user
这个时候我们测试接口 users/register
提交手机号/密码/确认密码/验证码 看是否能拿到后端传给我们的id phone token值

4.注册-前端
用户点击注册按钮后
如果校验通过,应该将后端发过来的id username token存到sessionStorage中 并跳转到首页界面
如果校验失败,应该在前端展示对应的错误信息
register.vue
<script>
export default {
name: 'Register',
data(){
return {
sms:"",
mobile:"",
password:"",
r_password:"",
validateResult:false,
interval_time:60, // /倒计时时间
btn_msg:'点击获取验证码',
flag:false, // 判断定时是否已经开启 }
},
created(){
},
methods:{
......
registerHandler(){
this.$axios.post(`${this.$settings.Host}/users/register/`,{
sms:this.sms,
phone:this.mobile,
password:this.password,
r_password:this.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('/') // 跳转到首页
}).catch((error)=>{
// 注册失败 打印错误信息
console.log(error.response);
}) }, getSmsCode(){ this.$axios.get(`${this.$settings.Host}/users/sms_code/${this.mobile}/`)
.then((res)=>{
this.flag = setInterval(()=>{
if(this.interval_time > 0){
this.interval_time--;
this.btn_msg=`${this.interval_time}秒后重新获取`;
this.disabled = true; // 点击了获取验证码之后 按钮变为不可点击
}else{ //倒计时停止 允许用户发送短信
this.interval_time=60;
this.btn_msg='点击发送验证码';
clearInterval(this.flag);
this.flag=false;
this.disabled = false
}
},1000)
})
.catch((error)=>{
this.$message.error(error.response.data.msg);
}) } }, };
</script>
5.Celery
1.Celery的简单使用
Celery是一个功能完备即插即用的异步任务队列系统。它适用于异步处理问题,当发送邮件、或者文件上传, 图像处理等等一些比较耗时的操作,我们可将其异步执行,这样用户不需要等待很久,提高用户体验。
文档:http://docs.jinkan.org/docs/celery/getting-started/index.html
Celery的特点是:
简单,易于使用和维护,有丰富的文档。
高效,单个celery进程每分钟可以处理数百万个任务。
灵活,celery中几乎每个部分都可以自定义扩展。
2.Celery的架构图

3.Celery的使用
......以后有时间再补上吧!
6.Celery完成短信发送功能
在最外层lyapi目录创建mycelery包
文件目录结构
# 文件结构目录
lyapi/
├── mycelery/
├── config.py # 配置文件
├── __init__.py
├── main.py # 主程序
└── sms/
└── tasks.py # 任务的文件,名称必须是这个!!!
main.py
# main.py from celery import Celery
import os
os.environ.setdefault('DJANGO_SETTINGS_MODULE','lyapi.settings.dev')
import django
django.setup() app = Celery() app.config_from_object('mycelery.config') app.autodiscover_tasks(['mycelery.sms',])
config.py
# config.py # 任务队列的链接地址(变量名必须叫这个)
broker_url = 'redis://127.0.0.1:6379/14'
# 结果队列的链接地址(变量名必须叫这个)
result_backend = 'redis://127.0.0.1:6379/15'
tasks.py
# tasks.py from mycelery.main import app
from lyapi.libs.ronglian_sms_sdk.sms import send_message
from django.conf import settings
from lyapi.settings import constants import logging
logger = logging.getLogger('django') @app.task(name='smsCode')
def sms_codes(phone,sms_code):
ret2 = send_message(settings.SMS_INFO.get('TID'), phone, (sms_code, constants.SMS_CODE_EXPIRE_TIME // 60))
if not ret2:
logger.error('{}手机号短信发送失败'.format(phone)) return '短信发送成功啦'
views.py
# views.py # 发送验证码
from mycelery.sms.tasks import sms_code
sms_code.delay(phone,sms_code) return Response({'msg':'ok'})
day80:luffy:短信sdk接入&点击获取验证码&注册功能的实现&Celery实现短信发送功能的更多相关文章
- day79:luffy:注册之对手机号的验证&实现基本的注册功能逻辑&点击获取验证码&redis
目录 1.前端和后端对于手机号的验证 2.实现基本的注册功能-不包括验证码 3.点击获取验证码 4.解决登录不上Xadmin的bug 5.redis register.vue页面 <templa ...
- Jquery插件实现点击获取验证码后60秒内禁止重新获取
通过jquery.cookie.js插件可以快速实现“点击获取验证码后60秒内禁止重新获取(防刷新)”的功能 先到官网(http://plugins.jquery.com/cookie/ )下载coo ...
- Andorid实现点击获取验证码倒计时效果
这篇文章主要介绍了Andorid实现点击获取验证码倒计时效果,这种效果大家经常遇到,想知道如何实现的,请阅读本文 我们在开发中经常用到倒计时的功能,比如发送验证码后,倒计时60s再进行验证码的获取 ...
- 微信小程序开发——文本框种输入手机号,点击获取验证码无反应的处理方法
异常描述: 如下图,输入手机号码之后,点击右侧的获取验证码,在开发工具是OK的,真机测试无反应: 页面编码跟H5差不多的,H5没出现这个问题,但是小程序就不一样了. 异常分析: 页面结构层面,为了方便 ...
- 快手、抖音、微视类短视频SDK接入教程,7步就能搞定
欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~ 本文由视频咖 发表于云+社区专栏 终端部分 按照如下三步操作,可以用 XCode 或者 Android Studio 编译和调试小视频 Ap ...
- 用户点击获取验证码之后我们会发送一条信息到用户手机,然后就会出现一个倒计时按钮,很像支付宝手机付款效果了,下面我给大家分享两个js效果
js代码 代码如下 复制代码 <div class="input"> <input type="button" id="bt ...
- js 点击获取验证码后的倒数60s
<!DOCTYPE html> <html> <head> <meta charset="UTF-8" /> <script ...
- iOS点击获取短信验证码按钮
概述 iOS点击获取短信验证码按钮, 由于 Demo整体测试运行效果 , 整个修改密码界面都已展现, 并附送正则表达式及修改密码逻辑. 详细 代码下载:http://www.demodashi.com ...
- 国内最简单的短视频SDK
最近阿里百川和趣拍一起合作推出了一个短视频SDK.之前很多厂商可能都是用的Vitamio的短视频SDK.之后我考察过,也做过一些调查,发现Vitamio真的奇贵无比,屌丝公司根本用不起,阿里和趣拍这下 ...
随机推荐
- 关于VS编译报错,但是错误信息未提示问题解决方案
可能代码中引用了别的类库中的函数,然后未编译被引用库导致编译报错,重新编译被引用库然后再编译当前库即可解决问题
- Centos-进程运行状态-ps
ps 显示系统进程在瞬间的运行状态 相关选项 -a 显示所有用户的进程,包含每个程序的完整路径 -x 显示所有系统程序,包括那些没有终端的程序 -u 显示使用者的名称和起始时间 -f 详细显示程序执 ...
- Go-归档文件-tar
文件归档 tar 1. 创建一个tar头部并自动填充tar头部信息 tar.FileInfoHeader() 联合 os.Stat() 方法 2. 手动填写 tar头部信息 tar.Header{} ...
- spring-boot-route(四)全局异常处理
在开发中,我们经常会使用try/catch块来捕获异常进行处理,如果有些代码中忘记捕获异常或者不可见的一些异常出现,就会响应给前端一些不友好的提示,这时候我们可以使用全局异常处理.这样就不用在代码中写 ...
- 请编写sql多语句表值函数统,计指定年份中每本书的销售总额
create table 图书表( 书号 varchar(50), 书名 varchar(50), 单价 int ) create table 销售表( 书号 varchar(50), 销售时间 da ...
- 独立看第一个C++程序到最终结果log----2019-04-16
(如果一个人夸你,千万别相信,一个人真优秀是不需要说出来的,所以别人夸你的时候也是自己最松懈的时候,千万不能飘,只能说明自己不是很差而已,世界上优秀的人很多,一直优秀到最后的人却是凤毛菱角. 如果一个 ...
- golang拾遗:指针和接口
这是本系列的第一篇文章,golang拾遗主要是用来记录一些遗忘了的.平时从没注意过的golang相关知识.想做本系列的契机其实是因为疫情闲着在家无聊,网上冲浪的时候发现了zhuihu上的go语言爱好者 ...
- Python 导入模块的两种方法:import xxx 和from...import xxx
import 方式导入模块 import tool.getsum.add # 导入模块,优先会从启动文件的当前目录开始寻找 # 如果找到,就使用 # 如果找不到,会在系统模块存放目录去 tool.ge ...
- .net core中的那些常用的日志框架(Serilog篇)
前言 上文说到Nlog日志框架,感觉它功能已经很强大,今天给大家介绍一个很不错的日志框架Serilog,根据我的了解,感觉它最大的优势是,结构化日志,它输出的日志是Json的格式,如果你使用的是Mon ...
- MeteoInfoLab脚本示例:AIRS Grid HDF数据
AIRS Grid HDF数据是HDF4 EOS格式,数据地理坐标信息可以被MeteoInfo自动识别,脚本程序更为简单.需要注意的是读取数据时Y轴是反向的(卫星数据通常如此).脚本程序: #Add ...