Django Celery异步发送短信

1. Celery介绍

Celery安装

> pip install celery==4.4.7
>
> pip install eventlet==0.26.1

Celery介绍:

Celery 是一个 基于python的分布式异步任务队列,通过它可以轻松的实现任务的异步处理

Celery优点:

celery核心:

2.Celery简单使用

创建worker==

  1. 创建一个文件laufing.py

#实例化对象
from celery import Celery

# 第一个参数worker name 
# broker 代理,消息中间件
app = Celery("myworker", broker="redis://:@localhost:6379/4")

#创建任务函数
@app.task
def task1():
    print("正在执行任务...")

2.前台启动worker进程。 在cmd 命令行输入如下:

celery -A 应用名 worker --loglevel=info -P eventlet

3.模拟django发送任务

ipython中模拟发送任务:在laufing.py的同级目录打开一个cmd命令行。

4.任务在worker进程中执行。

3. Celery存储任务结果

  1. 创建一个task.py文件,并创建worker

from celery import Celery


app=Celery("guojunchang",broker="redis://127.0.0.1:6379/5",
           backend="redis://127.0.0.1:6379/4")


@app.task
def task1(a, b):
	print("简单求和")
	return a + b


@app.task
def task2(a, b):
	print("2-s后求和")
	time.sleep(20)
	return a + b

2.前台启动worker

celery -A laufing worker -l info -P eventlet

3.发送任务,并获取结果 ipython中测试

from laufing import task1, task2

r1 = task1.delay(3, 5)  # 发送任务
r1.result

r2 = task2.delay(4, 7) #发送任务,并立即执行下一行,不会阻塞
r2.result   # worker来执行task,返回结果后才可以拿到

4. celery异步发送短信

  1. 在django项目主应用下创建celery.py文件,配置以下内容:

from celery import Celery
import os
from django.conf import settings

# 为celery配置环境变量,识别和加载django的配置文件
# 因为worker是脱离django启动的,且依赖其配置
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'Zzw.settings')

#创建celery应用
app = Celery('myworker',broker='redis://127.0.0.1:6379/6',backend='redis://127.0.0.1:6379/7')

3. 在django项目子应用下,创建tasks.py

from Zzw.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
    sdk=SmsSDK(settings.ACCID,settings.ACCTOKEN,settings.APPID)

    #组织数据
    tid='1' #短信模板
    mobile='%s'%mobile #手机号转换为字符串
    datas=('%s'%sms_code,'%s'%expire)  #手机验证码

    #发送短信,并解析响应
    res = sdk.sendMessage(tid=tid,mobile=mobile,datas=datas)
    return res

4.视图中发送异步任务

#发送短信的视图
class MaaAPIVew(APIView):
    def post(self,request):
        #1. 接收前端传来的数据
        moblie=request.data.get('mobile')
        # 数据校验
        if not all([moblie, ]):
            return Response({'code':400,'error':'数据错误'})
        # 2. 生成短信验证码
        sms_code='%d'%random.randint(10000,99999)
        #存储短信验证码
        redis_conn=redis.Redis(host='localhost',port=6379,db=3)
        redis_conn.set(moblie,sms_code,ex=300)
        #3. 请求容联云发送短信
        res=send_message.delay(sms_code,moblie)


        return Response({'code':200,'msg':'短信已发送,请注意查收'})

 验证短信验证码的视图

#验证短信验证码
class SmsAPIVew(APIView):
    def post(self,request):
        #接收前端数据
        sms_code=request.data.get('sms_code')
        uuid_=request.data.get('code_id')
        #查询redis  拿出存储的短信验证码
        redis_conn=redis.Redis(host='localhost',port=6379,db=3)
        stored_sms_code=redis_conn.get(uuid_)

        #判断
        if stored_sms_code and stored_sms_code.decode() ==sms_code:
            return Response({'code':200,'msg':'对比成功'})
        else:
            return Response({'code':400,'error':'对比失败'})

在django终端启动celery

# windows系统下启动
celery -A mdpro worker -l info -P eventlet

 今日报错

 解决

把py文件放到了一个文件夹里,就正常运行了,醉了啊/(ㄒoㄒ)/~~

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值