Python-Celery在Django中的使用,以及celery调用Django模型类

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 启动程序

  1. 切换命令目录到Django的根目录,也就是mycelery文件夹所在目录
  2. 执行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

大家可以看这篇文章

添加链接描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值