热门IT资讯网

django使用celery异步发送短信

发表于:2024-11-25 作者:热门IT资讯网编辑
编辑最后更新 2024年11月25日,1. 安装celery模块pip install -U celery==4.3.02. 创建celery相关目录xiaolan/ # 项目主目录├── mycelery/ ├── config
1. 安装celery模块
pip install -U celery==4.3.0
2. 创建celery相关目录
xiaolan/  # 项目主目录├── mycelery/    ├── config.py     # 配置文件    ├── __init__.py       ├── main.py       # 主程序    └── sms/          # 一个目录可以放置多个任务,该目录下存放当前任务执行时需要的模块或依赖        └── tasks.py  # 任务的文件,名称必须是这个
3. 创建celery配置文件config.py
# 注意: 我的redis因为没有设置密码所有可以这样用# 任务队列的链接地址broker_url = 'redis://127.0.0.1:6379/15'# 结果队列的链接地址result_backend = 'redis://127.0.0.1:6379/14'
4. 在man.py主程序中对django的配置文件进行加载, 把django和celery进行组合
import osimport djangofrom celery import Celery# 主程序# 创建celery实例对象app = Celery("xiaolan")# 把celery和django进行结合, 识别和加载django的配置文件os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'xiaolan.settings.dev')# 对django框架进行初始化django.setup()# 通过app对象加载配置app.config_from_object("mycelery.config")# 加载任务# 参数必须是一个列表, 里面的每一个都是任务的路径名称# 列: app.autodiscover_tasks(["任务1", "任务2"])app.autodiscover_tasks(["mycelery.sms"])# 启动Celery的命令# 强烈建议切换目录到mycelery目录下启动# celery -A main worker --loglevel=info
5. 配置tasks.py, 把注册短信发送功能, 整合成一个任务函数,代码:
from mycelery.main import appfrom .yuntongxun.sms import CCPfrom xiaolan.settings import constantsimport loggingfrom django.conf import settingslog = logging.getLogger("django")@app.task(name="send_sms")def send_sms(mobile, sms_code):    """异步发送短信"""    ccp = CCP()    try:        result = ccp.send_template_sms(mobile, [sms_code, constants.SMS_CODE_EXPIRE//60 ], settings.SMS.get("_templateID"))        return result    except:        log.error("发送短信验证码失败!手机号:%s" % mobile)
6. 把django中的短信发送模块和相关常量配置文件直接移动到当前sms任务目录中
mycelery/├── config.py├── __init__.py├── main.py└── sms/    ├── __init__.py    ├── tasks.py    └── yuntongxun        ├── CCPRestSDK.py        ├── __init__.py        ├── sms.py        └── xmltojson.py
7. 在django里面, 我们调用celery来异步执行任务, 需要完成2个步骤:
# 1. 声明一个和celery一模一样的任务函数,但是我们可以导包来解决from mycelery.sms.tasks import send_sms# 2. 调用任务函数,发布任务send_sms.delay(mobile,sms_code)# send_sms.delay() 如果调用的任务函数没有参数,则不需要填写任何内容
8. 启动项目
celery -A mycelery.main worker --loglevel=info
0