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"})