自己的项目需要使用异步发送消息,看了网上很多的文章,一个一个的看或者跟着敲,花了很多时间都没有搞出来,最后试出来了方法,这里记录一下.
首先是下载需求的包
pip install celery # 直接最新版,没什么要求
pip install redis==3.3.0
pip install gevent # 这个是用来在win10上开启celery的,因为celery4.0以上不支持windows
# 我的django版本是1.11
目录结构:
1599297178(1).png1.在项目最外层,也就是跟项目同名称包的同级创建一个包MyCelery(这个随便取名字).
2.在MyCelery下创建config.py文件,文件代码:
broker_url = 'redis://127.0.0.1:6379/15'
result_backend = 'redis://127.0.0.1:6379/14'
# 主要来配置中间件和结果存储地
3.在MyCelery下创建main.py文件,文件代码:
# 主程序
import os
import django
from celery import Celery
# 创建celery实例对象
app = Celery("sms")
# 把celery和django进行组合,识别和加载django的配置文件
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "DjangoCelery.settings")
django.setup()
# 通过app对象加载配置
app.config_from_object("MyCelery.config")
# 加载任务
# 参数必须必须是一个列表,里面的每一个任务都是任务的路径名称
# app.autodiscover_tasks(["任务1","任务2"])
app.autodiscover_tasks(["MyCelery.sms", ])
4.在MyCelery下创建一个包,包名随便取,这个包的意思就是任务数,可以创建无数个这样同类似的包,只需要在main.py中备注就ok. 然后再包中创建tasks.py文件,文件名必须是tasks.py不能有所改变,这是存放自己的任务的文件,代码:
# celery的任务必须写在tasks.py的文件中,别的文件名称不识别!!!
from MyCelery.main import app
import time
import logging
log = logging.getLogger("django")
@app.task # name表示设置任务的名称,如果不填写,则默认使用函数名做为任务名
def send_sms(mobile):
"""发送短信"""
print("向手机号%s发送短信成功!" % mobile)
time.sleep(5)
return "send_sms OK"
@app.task # name表示设置任务的名称,如果不填写,则默认使用函数名做为任务名
def send_sms2(mobile):
print("向手机号%s发送短信成功!" % mobile)
time.sleep(5)
return "send_sms2 OK"
5.在视图中调用任务:
from django.http import HttpResponse
from django.views import View
from datetime import timedelta
from datetime import datetime
from MyCelery.sms.tasks import send_sms
class IndexView(View):
def get(self, request, *args, **kwargs):
ctime = datetime.now()
utc_ctime = datetime.utcfromtimestamp(ctime.timestamp())
time_delay = timedelta(seconds=10)
task_time = utc_ctime + time_delay
result = send_sms.apply_async(["911", ], eta=task_time)
print(result.id)
return HttpResponse('ok')
# 这里做的是定时任务,10S后发送
必须先启动celery,才能调用,只要任务有所改变都要重新启动celery,windows启动celery的方法:
celery -A MyCelery.main worker -l info -P gevent
网友评论