Django实现同步发送短信验证码和异步发送

下载:

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

  • 4
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

w_ang__ang

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值