这里我们使用容联云平台发送验证码,可以根据官方文档来写.
python SDK文档:Python SDK
安装SDK
pip install ronglian_sms_sdk
容联云地址:容联云通讯_短信平台、手机验证码、语音验证码、IM即时通讯、云呼叫系统等互联网通信服务
登录进入如下界面:
绑定一个测试手机号
Celery :基于python的分布式异步任务队列
安装celery 以及 eventlet并发网络库 或者 gevent 协程库
这里我们使用eventlet
pip install celery==4.4.7
pip install eventlet==0.26.1
celery的工作原理图
一.在Django项目同名目录下创建一个celery.py文件
from celery import Celery # 导入celery
from django.conf import settings
import os
# 配置环境变量 celery 的worder是脱离django启动,但是依赖其配置文件
os.environ.setdefault(
"DJANGO_SETTINGS_MODULE",
'项目名.settings'
)
# 实例化celery对象
# 配置broker: 用于存放任务的
# backend : 存放任务执行结束后的结果
# redis数据库有密码的话 "redis://:密码@127.0.0.1:6379/5"
app = Celery(
"worker",
broker="redis://127.0.0.1:6379/5",
backend="redis://127.0.0.1:6379/6"
)
# 从所有注册的app中 发现任务函数
app.autodiscover_tasks(settings.INSTALLED_APPS)
二.需要使用celery的应用中创建tasks.py文件 创建任务函数
from django_421.celery import app # 导入编写的celery实例对象
from ronglian_sms_sdk import SmsSDK # 容联云
from django.conf import settings
# 创建任务函数
@app.task
def send_message(mobile, sms_code, expire=5):
"""
:param mobile: 手机号
:param sms_code: 验证码
:param expire: 验证码的有效期
:return: res
"""
# 实例化sdk 参数在图一所指位置
sdk = SmsSDK(
accId="主账户id",
accToken="账户授权令牌",
appId="应用id"
)
# 组织数据 字符串类型
tid = "1" # 模板id
mobile = "%s" % mobile # 格式化手机号
datas = ("%s" % sms_code, "%s" % expire) # 短信验证码 有效期
# 发送短信并接收响应
res = sdk.sendMessage(tid=tid, mobile=mobile, datas=datas)
return res
三.编写发送短信验证码的视图
from rest_framework.views import APIView
from rest_framework.response import Response
from users.tasks import send_message # 导入发送短信的任务函数
import random
import redis
class SmsAPIView(APIView):
def post(self, request):
# 1,获取前端数据
mobile = request.data.get("mobile")
# 2,使用random.randint生成一个随机短信验证码
sms_code = "%s" % random.randint(10000, 99999)
# 2-1存储短信验证码 连接数据库,创建redis对象
redis_conn = redis.Redis()
# 将验证码存入redis中 有效期300秒
redis_conn.set(mobile, sms_code, ex=300)
redis_conn.close()
# 3,请求容联云 发送短信 异步发送需要使用 delay() (重要)
res = send_message.delay(sms_code=sms_code, mobile=mobile)
# 4,请求发送后 不需要等待验证码发送成功 直接返回响应
return Response({"msg":"短信已发送,请注意查收","code":200})