django配合xadmin编写celery定时任务以及异步任务

本文介绍如何在Django项目中使用Celery处理异步任务和定时任务,包括发送邮件和更新用户状态等场景,详细讲解了Celery的配置过程及与Django的集成。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

celery是项目中不可或缺的神器
比如,当我们注册账户的时候,需要发送邮箱验证码
主程序运行到这来,邮箱发送可能需要30秒
不可能网页加载30秒,一直转圈圈,等邮件发送完毕才能进行下一步操作吧
这样你的项目上线后除了你自己基本没人会注册

还有
比如判断用户登录是否为每日首次登录,
当项目较小的时候,有一种策略就是设置一个用户每日登录状态的字段,当用户当日
登录过,就修改该状态为False,然后用celery进行定时任务,每日凌晨多少点重置用户登录状态的字段

关于celery的强大还有许多,目前就说常用的几种把

接下来是celery配置

startapp一个CeleryTask的app,然后注册

Pip install django-celery=3.2.2
Pip install django-redis=4.10.0
pip install redis==2.10.6
Pip install flower #暂时不用
然后照着我这个版本下载就行了
目前来讲最为稳定的版本组合

然后
#settings文件

INSTALLED_APPS = [
    'xadmin',
   ........
    'CeleryTask.apps.CelerytaskConfig',
    'djcelery',
]


import djcelery

djcelery.setup_loader()

#使用本地redis服务器中的0号数据库,redis密码为123456
BROKER_URL = 'redis://127.0.0.1:6379/0'
CELERYBEAT_SCHEDULER = 'djcelery.schedulers.DatabaseScheduler'
CELERY_RESULT_BACKEND = 'redis://127.0.0.1:6379/1'
CELERY_TASK_SERIALIZER = 'json'
CELERY_RESULT_SERIALIZER = 'json'
CELERY_ENABLE_UTC = False
CELERY_TIMEZONE = 'Asia/Shanghai'
CELERY_TASK_RESULT_EXPIRES = 10
CELERY_ACCEPT_CONTENT = ['pickle', 'json', 'msgpack', 'yaml']
CELERY_IMPORTS = ("CeleryTask.tasks",)

在settings统计目录中创建celery.py文件

from __future__ import absolute_import

import os
from celery import Celery, platforms
from django.conf import settings

os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'blog_run.settings')

#主应用名,blog_run其实可以替换成你喜欢的任何一个名称
app = Celery('blog_run')
platforms.C_FORCE_ROOT = True

# 配置应用
app.conf.update(
    # 本地Redis服务器
    BROKER_URL=settings.BROKER_URL,
)

app.config_from_object('django.conf:settings')
app.autodiscover_tasks(lambda: settings.INSTALLED_APPS)


@app.task(bind=True)
def debug_task(self):
    print('Request: {0!r}'.format(self.request))

主项目目录的init中(也是和settings统计的那个)

from __future__ import absolute_import
from blog_run.celery import app as celery_app

import pymysql
pymysql.install_as_MySQLdb()

接下来别忘了迁移数据库
python manage.py check
python manage.py makemigrations
python manage.py migrate
三步走战略

会生成6个celery的管理表
因为我的项目使用的是mysql,所以在mysql里可以看到:
在这里插入图片描述

如果你在迁移的时候,报错,说是什么超过767字节长度,
这种错误是因为添加索引的字段,mysql有长度要求
比如说varchar(255)
按字符转字节按乘3计算
255*3>767
所以无法创建数据表

如果你出现了删除的报错
那么我估计你使用的应该是utf8mb4字符集
如果你不想去修改配置文件增加此类字段长度或者重新更换innodb字符集的话

最最最最最简单的办法就是,
在这里插入图片描述

没错,新建一个utf8的字符集的数据库
然后更改配置里面的名字

好了 继续往下

在这里插入图片描述

来到app中,创建两个py文件
一个tasks
一个adminx

tasks.py中:

@app.task(name='tasks.fresh_user')
def fresh_user():
    User.objects.filter(is_fresh=False).update(is_fresh=True)
    return '用户状态刷新完成'


@app.task
def email_send(email):
    time.sleep(10)
    print('发送邮件',email)
    return '已发送'

定时任务fresh_user
记得加name='tasks.fresh_user’这句话,帮助worker定位项目

异步任务email_send,则随意啦,反正多放在视图里面调用

注册好两个任务后

xadmin文件登场:

from __future__ import absolute_import, unicode_literals

import xadmin
from djcelery.models import (
  TaskState, 
  WorkerState,
  PeriodicTask, 
  IntervalSchedule,
   CrontabSchedule,
)

xadmin.site.register(IntervalSchedule) # 存储循环任务设置的时间
xadmin.site.register(CrontabSchedule) # 存储定时任务设置的时间
xadmin.site.register(PeriodicTask) # 存储任务
xadmin.site.register(TaskState) # 存储任务执行状态
xadmin.site.register(WorkerState) # 存储执行任务的worker

好了,非常完美

来看看在界面是怎样的

在这里插入图片描述
嗯,接下来添加任务

首先interval可以理解为计时
crontab用户linux的肯定都很熟了,定时任务
先把两个新增上时间限制:
在这里插入图片描述
这个指的是每15秒执行一次

crontab新增:
在这里插入图片描述
这个指的是每天凌晨4点执行一次

新增定时任务:
在这里插入图片描述
有几个地方要特别注意
interval和crontab只能选一个
name如果是按照我的配置来的,名字也要照我的格式命名
argument我这里没写,如果有参数,传入的是列表形式,也就是其他语言的数组形式

设置为保存即可

来尝试运行一下定时任务
首先打开两个终端
最最最最最最最最最快的方法
在这里插入图片描述
然后开启redis
redis在windows环境下怎么开启呢????
太多了,这里不写,下次再说,等不及的右上点+,自行百度

最后分别输入两个命令
添加任务到broker:celery -A blog_run beat -l info (–max-inteval #这段可加可不可加,代表每十秒唤醒一次)

处理broker任务:
celery -A blog_run worker -l info -P eventlet
#eventlet 需要下载

我这里写的blog_run你们可替换你们的项目名称,这个可以改,只要是settings和celery配置文件所在的目录就行了

异步任务放在视图里调用就行了
然后开启celery
python manage.py celery worker -A blog_run -l info
redis在执行命令前开启,别忘了

就说到这里了,下次抽个空来讲讲邮件系统

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值