一:发送短信出现问题:
1:问题描述:由于容联云接口依赖网络,如果发送容联云一直不响应,那么就导致我的django程序一直堵塞在这里,这里就会频繁给容联云发送请求。给前端带来的效果就是点击注册之后一直无法响应,页面一直不动,也不会出现倒计时。

二:异步任务:
目的:解耦合:
将发送短信的业务,交给专门的异步任务去处理,自己不再管了,而是再向下处理。而我们称发布任务的叫做:生产者,接收任务的叫做:消费者。

三:celery框架:
采用生产者消费者设计模式:生产者将任务发布到消息队列中,消费者在任务队列中提取任务并且执行。这个项目生产者是: django,消息队列是: redis数据库 , 消费者是:celery框架。

四:准备工作:
1:安装celery依赖包:
pip install Celery -i https://pypi.tuna.tsinghua.edu.cn/simple
2:在外层 meiduo_mall 增加一个包, 名字叫做: celery_tasks
3:在 celery_tasks 包中添加 main.py 文件:里面先Celery这个类,然后创建一个Celery对象。
# 从你刚刚下载的包中导入 Celery 类
from celery import Celery
# 利用导入的 Celery 创建对象
celery_app = Celery('meiduo')
4:在 celery_tasks 包中再添加一个 config.py 文件:
在配置文件中指定消息队列:使用redis的3号库。
broker_url='redis://192.168.203.153:6379/3'
5:将配置文件加载到main.py中:
注意:指定配置文件的参数:是config.py的导包路径。
celery_app.config_from_object('celery_tasks.config')
6: celery_tasks 包下, 再创建一个包,起名为sms。(名字任意)
7:在sms包中创建一个tasks.py文件(文件名固定)
8:在main.py中设置自动捕获task.py中的任务。
注意:autodiscover_tasks,里面写一个包的导包路径,这样会自动检索包内的文件。
celery_app.autodiscover_tasks(['celery_tasks.sms'])
9:将云通讯复制到celery_task中来,因为以后要剥离业务。
五:业务实现:在task中做业务:
1:注意:这里需要celery_tasks语法糖装饰一下。
from celery_tasks.main import celery_app
@celery_app.task(name='ccp_send_sms_code')
def ccp_send_sms_code(mobile, sms_code):
'''该函数就是一个任务, 用于发送短信'''
result = CCP().send_template_sms(mobile,[sms_code, 5],1)
return result
2:修改原来的调用: meiduo_mall/verifications/views
from celery_tasks.sms.tasks import ccp_send_sms_code
# 原来的写法:
# CCP().send_template_sms(mobile, [sms_code, 5], 1)
# 改为现在的写法, 注意: 这里的函数,调用的时候需要加: .delay()
ccp_send_sms_code.delay(mobile, sms_code)
2:启动服务:
cd ~/projects/meiduo_project/meiduo_mall
celery -A celery_tasks.main worker -l info
浙公网安备 33010602011771号