Celery在Django中的使用
1. Celery在Django中的普通使用(该方法更加简单)
1.1 项目结构
我们通过celery需要实现一个发送短信以及发送邮箱的异步任务。
为了提高耦合性,我们将celery的事件定义单独写成一个个的包形式,分离管理
tree 目录结构:
项目主目录
├─ Djangao项目其他文件
└─ mycelery # celery定义主目录
├─ email # 发送邮件函数包
│ │─ __init__.py
│ └─ tasks.py # 邮件相关事件定义
├─ sms # 发送短信函数包
│ │─ __init__.py
│ └─ tasks.py # 短信相关事件定义
│─ __init__.py
│─ config.py # celery自定义配置文件
└─ main.py # celery启动主程序
1.2 定义main文件以及配置文件
/mycelery/main.py celery启动的主程序
from celery import Celery
app = Celery('mycelery')
# 将Django配置添加到环境变量中
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'MeiDuoMall.settings')
# 实现配置分离,加载config中的配置
app.config_from_object('mycelery.config')
# 自动识别加载task
app.autodiscover_tasks([
'mycelery.sms',
'mycelery.email' # 不需要加.tasks
])
# 使用autodiscover_tasks自动加载tasks中的函数
# 这里使用的是autodiscover_tasks方法
## 会自动从对象中查找tasks定义,所以不需要写成mycelery.email.tasks
/mycelery/config.py 配置文件
broker_url = 'redis://192.168.32.128:6379/1' # 中间储存件的连接地址
result_backend = 'redis://192.168.32.128:6379/2' # 结果地址
1.3 定义事件函数
/mycelery/sms/tasks.py 文件(短信发送程序)
import time
from mycelery.main import app
@app.task
def send_sms(moblie):
time.sleep(2)
sms_context = f'短信验证码:66666'
print(f'发送短信给:{moblie},内容:{sms_context}')
1.4 启动程序
- 切换命令目录到Django的根目录,也就是mycelery文件夹所在目录
- 执行celery命令启动
celery -A mycelery.main worker -l INFO -P eventlet
1.5 定义视图函数,调用异步任务
DjangoApp下的views.py
from mycelery.sms.tasks import send_sms
from mycelery.email.tasks import send_email
from django.views import View
class SmsCodeTest(View):
"""发送测试短信视图函数"""
def get(self,request):
moblie = request.GET.get('moblie')
send_sms.delay(moblie)
send_email.delay(moblie)
return http.JsonResponse({"code":1,"message":"发送成功!"})
2. 在Celery中调用Django模型类
在日常开发中,我们可能需要将发送短信的记录/日志存储到数据库,并且能够和Django更好的结合查看,此时我们可以通过Django直接定义模型类,并在Celery中加载模型类直接使用!
2.1 修改原本定义的main.py
import os, sys # 导入os,sys模块,用于添加环境变量
from celery import Celery
import django
sys.path.append(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
# 将Django项目根目录添加到环境变量
app = Celery('mycelery')
# 将Django配置添加到环境变量中(函数中可能会用到Django方法)
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'MeiDuoMall.settings')
# 实现配置分离,加载config中的配置
app.config_from_object('mycelery.config')
django.setup()
# Django组件初始化
# 没有这一步后面调用模型类,是找不到模块的
# 自动识别加载task
app.autodiscover_tasks([
'mycelery.sms',
'mycelery.email'
])
2.2 定义模型类并调用
在Django应用程序中定义模型类
from django.db import models
class SmsRecord(models.Model):
"""
短信记录模型类
"""
mobile = models.CharField(max_length=11, verbose_name='手机号', validators=[
RegexValidator(regex=r'^1\d{11}$', message='手机号必须是11位数字,且必须1开头'), ])
sms_context = models.CharField(max_length=256, verbose_name='短信正文')
send_time = models.DateTimeField(auto_now_add=True)
send_result = models.CharField(max_length=128, blank=True,null=True)
/mycelery/sms/tasks.py 文件(短信发送程序)
import time
from mycelery.main import app
from apps.users.models import SmsRecord # 导入模型类
@app.task
def send_sms(moblie):
time.sleep(2)
sms_context = f'短信验证码:66666'
print(f'发送短信给:{moblie},内容:{sms_context}')
SmsRecord.objects.create(
mobile=moblie,
sms_context=sms_context
) # 调用模型类
此时通过异步调用的,也能搞调用Django模型类并实现增删查改。
3. 通过django-celery-results插件运行Celery
大家可以看这篇文章