复制代码

Python Django Celery异步发送短信和windows启动celery

前言

 

Celery 易于使用和维护,并且它 不需要配置文件 。

Celery版本是4.4.7

windows启动:celery -A celery_tasks.main worker -l info --pool=solo

 

importlib-metadata版本是0.19(必须要这个包)

 

Celery 有一个活跃、友好的社区来让你寻求帮助,包括一个 邮件列表 和一个 IRC 频道 。

倘若连接丢失或失败,职程和客户端会自动重试,并且一些中间人通过 主/主 或 主/从 方式复制来提高可用性。

使用Celery完成发送短信

meiduo/meiduo_mall下创建celery_tasks用于保存celery异步任务。

在celery_tasks目录下创建config.py文件,用于保存celery的配置信息

broker_url = "redis://127.0.0.1/14"

 

在celery_tasks目录下创建main.py文件,用于作为celery的启动文件

from celery import Celery
import os
if not os.getenv('DJANGO_SETTINGS_MODULE'):
    os.environ['DJANGO_SETTINGS_MODULE'] = 'lgshop.dev'

#celery入口文件
#创建celery实列
celery_app = Celery('lg')

#加载配置文件
celery_app.config_from_object('celery_tasks.config')

#注册任务
celery_app.autodiscover_tasks(['celery_tasks.sms','celery_tasks.email'])

#启动celery
#   celery -A celery_tasks.main worker  -l info --pool=solo

在celery_tasks目录下创建sms目录,用于放置发送短信的异步任务相关代码。

将提供的发送短信的云通讯SDK放到celery_tasks/sms/目录下。

在celery_tasks/sms/目录下创建tasks.py文件,用于保存发送短信的异步任务

#定义任务:发送短信
from celery_tasks.main import celery_app
from celery_tasks.sms.ronglianyun import constants
from celery_tasks.sms.ronglianyun.ccp_sms import CCP

@celery_app.task(name='send_sms_code')
def send_sms_code(mobile,sms_code):
    """
    发送短信验证码异步任务
    :param mobile:手机号
    :param sms_code:短信验证码
    :return:成功 0 失败 1
    """

    send_ret = CCP().send_message(mobile, (sms_code, constants.SMS_CODE_REDIS_EXPIPES // 60), constants.SEND_SMS_TEMPLATE_ID)
    return send_ret

云通讯代码

from ronglian_sms_sdk import SmsSDK
import json
accountSid = '自己的'

# 说明:主账号Token,登陆云通讯网站后,可在控制台-应用中看到开发者主账号AUTH TOKEN
accountToken = '自己的'

# 请使用管理控制台首页的APPID或自己创建应用的APPID
appId = '自己的'

#单列设计模式
class CCP(object):
    def __new__(cls, *args, **kwargs):
        #如果是第一次实例化,返回实例化对象,如果是第二次实例化,返回上一次实例话

        #判断是否存在类属性_instance
        if not hasattr(cls,'_instance'):
            cls._instance = super(CCP, cls).__new__(cls,*args,**kwargs)
            cls._instance.sdk = SmsSDK(accountSid,accountToken,appId)
        return cls._instance

    def send_message(self,msilib,datas,tid):
        sdk = self._instance.sdk
        # tid = '1'
        # msilib = '13397680341'
        resp = sdk.sendMessage(tid,msilib,datas)
        result = json.loads(resp)
        if result['statusCode']=='000000':
            return 0
        else:
            return -1
if __name__ == '__main__':
    c = CCP()
    c.send_message('自己的手机号',('123','5'),1)
    pass

在自己的app中的views使用celery异步任务发送短信

如:

from celery_tasks.sms import tasks as sms_tasks

class SMSCodeView(GenericAPIView):
    ...
        # 发送短信验证码
        sms_code_expires = str(constants.SMS_CODE_REDIS_EXPIRES // 60)
        sms_tasks.send_sms_code.delay(mobile, sms_code, sms_code_expires)

        return Response({"message": "OK"})

 

posted @ 2023-03-15 17:05  怪~咖  阅读(168)  评论(0编辑  收藏  举报
复制代码