Django-使用Celery异步发送短信验证码

  • 当Django执行中遇到耗时操作,比如请求第三方发送短信,为了不阻塞进程,应当将耗时代码从主业务中解耦出来(使用生产者消费者模式)


    生成者消费者
  • 在Django中可使用Celery完成异步,我们在使用生产者消费者模式时,只需要关注任务本身,极大的简化了程序员的开发流程。

  • 可使用RabbitMQ或者Redis作为消息队列的容器

Celery是什么

介绍:

  • 一个简单、灵活且可靠、处理大量消息的分布式系统,可以在一台或者多台机器上运行。
  • 单个 Celery 进程每分钟可处理数以百万计的任务。
  • 通过消息进行通信,使用消息队列(broker)在客户端和消费者之间进行协调。
    安装方式
  • pip install -U Celery

使用Celery定义发送短信任务

  1. 在项目根目录,即manage.py同级目录下创建Celery的包,如命名为celery_tasks
  2. 在celery_tasks包内创建main.py文件,创建Celery实例。
# celery启动文件
from celery import Celery


# 创建celery实例
celery_app = Celery('meiduo')
  1. 加载Celery配置,在celery_tasks包内创建config.py文件,指定消息队列位置,我这里使用的是Redis, 最好还是用RabbitMQ
# 指定消息队列的位置
# 这里使用redis作为队列容器
broker_url = "redis://127.0.0.1:6379/12"
  1. 定义发送短信任务:在celery_tasks包内创建任务包sms,包内创建任务文件tasks.py
    特别注意:tasks.py命文件名必须为此名,不可自定义其他命名!!
# bind:保证task对象会作为第一个参数自动传入
# name:异步任务别名
# retry_backoff:异常自动重试的时间间隔 第n次(retry_backoff×2^(n-1))s
# max_retries:异常自动重试次数的上限
from meiduo_mall.libs.yuntongxun.sms import CCP
# constants为自定义的过期时间配置文件
from celery_tasks.sms import constants
from celery_tasks.main import app

# 使用装饰器装饰任务
@app.task(bind=True, name="send_sms", retry_backoff=3)
def send_sms(self,mobile,sms_code):
    """
    异步发送短信任务
    :param self:
    :param mobile:手机号
    :param sms_code: 短信验证码
    :return: 成功0,失败-1
    """
    # 将耗时的代码封装在一个方法中
    ccp = CCP()
    ret = ccp.send_template_sms(mobile, [sms_code,constants.SMS_CODE_EXPIRES],1)
    if ret != 0:
         raise self.retry(exe=Exception("发送短信失败"), max_retries=3)
    return ret
  1. 在main.py文件中注册任务
# celery启动文件
from celery import Celery


# 创建celery实例
celery_app = Celery('meiduo')
# 加载celery配置
celery_app.config_from_object('celery_tasks.config')
# 自动注册celery任务
celery_app.autodiscover_tasks(['celery_tasks.sms'])

Celery任务就定义完成了,只需要在指定位置调用任务即可:

Celery任务开启和调用

  1. 启动Celery服务:
    在项目根目录下执行
    celery -A celery_tasks.main worker -l info
    • -A指对应的应用程序, 其参数是项目中 Celery实例的位置。
    • worker指这里要启动的worker。
    • -l指日志等级,比如info等级。
  2. 调用发送短信任务
    在指定位置,执行Celery任务,参照上篇文章:
    Django-实现图形验证码、短信验证码功能(二)
ccp_send_sms_code.delay(mobile, sms_code)

该任务将会异步执行,不会阻塞后续代码执行。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,189评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,577评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,857评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,703评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,705评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,620评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,995评论 3 396
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,656评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,898评论 1 298
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,639评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,720评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,395评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,982评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,953评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,195评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,907评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,472评论 2 342

推荐阅读更多精彩内容

  • 我有一个妹妹 不是很多人想要的 那种别人家的妹妹 有点傻乎乎的 学习却是比我聪明很多 但是她会惹我生气 可是我的妹...
    星辰如洒揽凉风阅读 229评论 0 1
  • 嵇康是竹林七贤之一。他帅气、潇洒、刚直,是一个超凡脱俗的人。 他很出众。 有人对王戎说:“嵇绍卓越得像...
    小胡_804d阅读 583评论 0 0
  • 这感觉就好像你做什么都弄不好,这种深深的无力感让人觉得挫败,觉得无能。好累
    南生静安阅读 180评论 0 0