下载:
pip install ronglian_sms_sdk
容联云地址:容联云通讯_短信平台、手机验证码、语音验证码、IM即时通讯、云呼叫系统等互联网通信服务
注册账号:
这三个记录下来
添加测试手机号
全部完成
1.非异步
创建一个.py文件
注:这里是在子应用里面创建
然后封装发送短信验证码方法
注这里的 accId accToken appId 就是上面让记得东西
from ronglian_sms_sdk import SmsSDK
import json
#下面这三个写自己的
accId = '8aaf0708809721d00180f4d8f1d32010'
accToken = 'ba9c1afcd60945bd83370063567df3c5'
appId = '8aaf0708809721d00180f4d8f2db2017'
def send_message(sms_code,mobile,expire=5):
sdk = SmsSDK(accId=accId,accToken=accToken,appId=appId)
# 准备数据
tid = '1'
datas = ('%s'%sms_code,'%s'%expire)
# 发送短信
res = sdk.sendMessage(tid=tid,mobile=mobile,datas=datas)
# 解析json数据
data = json.loads(res)
# 判断发送短信是否成功
if data.get('statusCode') == '000000':
return True
return False
然后在编写发送短信验证码视图
在views里面编写
from workers.utils import send_message
from workers.tasks import send_message
class Sms_Code(APIView):
def get(self,request):
mobile = request.query_params.get('mobile')
print(mobile)
if mobile and len(mobile) == 11:
redis_con = redis.Redis(host='127.0.0.1',port=6379)
flag_key = '%s_flag'%mobile
sms_key = '%s_sms'%mobile
if redis_con.get(flag_key):
return Response({
'code':400,
'msg':'操作过于频繁'
})
else:
sms_code = random.randint(1000,9999)
redis_con.set(sms_key,sms_code,ex=300)
# 是否频繁发送
redis_con.set(flag_key,1,ex=60)
# 发送短信
result = send_message(sms_code,mobile) #同步执行,django会阻塞在这里
# 提交一个异步任务
if result:
return Response({'code':200,'msg':"发送短信成功"})
return Response({'code':501,'msg':"发送短信失败"})
else:
return Response({'code':"400",'msg':'手机号不合法'})
2.异步发送短信验证码
首先下载celery
pip install celery==4.4.7
pip install eventlet==0.26.1
celery的介绍和使用 见博客:
异步处理Celery5大核心和工作流程_w_ang__ang的博客-CSDN博客
在项目根目录同名下创建.py文件
编写以下代码:
from celery import Celery
import os
from django.conf import settings
# Celery 需要依赖django的配置文件
# 配置环境变量
os.environ.setdefault('DJANGO_SETTINGS_MODULE','p6_0518.settings')
# 创建应用
app = Celery('djangoWorker')
# 简单配置
app.conf.broker_url = 'redis://@127.0.0.1:6379/5'
app.conf.result_backend = 'redis://@127.0.0.1:6379/6'
# 自动发现任务
app.autodiscover_tasks(settings.INSTALLED_APPS)
然后在子应用创建.py文件
编写以下代码:
from p6_0518.celery import app
from ronglian_sms_sdk import SmsSDK
from django.conf import settings
import json
# 定义任务函数
@app.task
def send_message(sms_code, mobile, expire=5):
sdk = SmsSDK(accId=settings.ACCID, accToken=settings.ACCTOKEN, appId=settings.APPID)
# 准备数据
tid = '1'
datas = ('%s' % sms_code, '%s' % expire)
# 发送短信
res = sdk.sendMessage(tid=tid, mobile=mobile, datas=datas)
# 解析json数据
data = json.loads(res)
# 判断发送短信是否成功
# if data.get('statusCode') == '000000':
# return True
# return False
return data
编写views里面的视图方法:
from workers.utils import send_message
from workers.tasks import send_message
class Sms_Code(APIView):
def get(self,request):
mobile = request.query_params.get('mobile')
print(mobile)
if mobile and len(mobile) == 11:
redis_con = redis.Redis(host='127.0.0.1',port=6379)
flag_key = '%s_flag'%mobile
sms_key = '%s_sms'%mobile
if redis_con.get(flag_key):
return Response({
'code':400,
'msg':'操作过于频繁'
})
else:
sms_code = random.randint(1000,9999)
redis_con.set(sms_key,sms_code,ex=300)
# 是否频繁发送
redis_con.set(flag_key,1,ex=60)
# 发送短信
# result = send_message(sms_code,mobile) #同步执行,django会阻塞在这里
# 提交一个异步任务
res = send_message.delay(sms_code,mobile) #异步执行,django不会等待
# if result:
# return Response({'code':200,'msg':"发送短信成功"})
# return Response({'code':501,'msg':"发送短信失败"})
return Response({'code':200,'msg':"短信已发送请注意查收"})
else:
return Response({'code':"400",'msg':'手机号不合法'})
配置路由:
这样整个功能就做好了
注意:django需要启动celery
celery -A p6_0518 worker -l info -P eventlet