笔记概要:
- 安装依赖库
- settings.py配置
- INSTALLED_APPS中注册django_celery_beat、django_celery_results
- 修改时区TIME_ZONE和 USE_TZ
- 增加celery配置
- 配置定时任务
- 新增celery.py文件,实例化celery应用
- 增加tasks.py ,用于存放定时任务
- views.py中实现定时定时任务接口,用于动态添加任务
依赖库:
Django==5.0.2
django_celery_beat==2.6.0
django-celery-results==2.5.1
celery==5.3.6
django-redis==5.4.0
1.settings.py 文件配置
django_celery_beat和django_celery_results添加到INSTALLED_APPS中
INSTALLED_APPS=[
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
……
'rest_framework',
'django_celery_beat',
'django_celery_results',
]
TIME_ZONE和 USE_TZ修改如下:
celery配置
DJANGO_CELERY_BEAT_TZ_AWARE=False
CELERY_ENABLE_UTC=False
CELERY_BROKER_URL='redis://localhost:6379/5'
CELERY_RESULT_BACKEND='redis://localhost:6379/6'
CELERY_ACCEPT_CONTENT=['application/json']
CELERY_TASK_SERIALIZER='json'
CELERY_RESULT_SERIALIZER='json'
CELERY_TIMEZONE='Asia/Shanghai'
CELERY_BEAT_SCHEDULER='django_celery_beat.schedulers:DatabaseScheduler'
配置定时任务
CELERY_BEAT_SCHEDULE={
"sample_task":{
"task":"drfUser.tasks.run_test_task",
"schedule":crontab(hour='18',minute="10"),
}
}
2.celery.py文件(与settings.py同级)
from__future__import absolute_import,unicode_literals
import os
from celery import Celery
os.environ.setdefault('DJANGO_SETTINGS_MODULE','drf.settings')
app=Celery('drf',broker_connection_retry_on_startup=True)
#namespace='CELERY'作用是允许你在Django配置文件中对Celery进行配置
#但所有Celery配置项必须以CELERY开头,防止冲突
app.config_from_object('django.conf:settings',namespace='CELERY')
app.autodiscover_tasks()
3.tasks.py(放到django项目的任一模块中,本人放在drfUser模块下)
from celery import shared_task
@shared_task
def run_test_task():
print("这是测试任务")
4.views.py编写添加定时任务的接口
class CreateTaskView(APIView):
"""创建任务视图"""
authentication_classes = []
def post(self, request):
"""创建任务 接口传参,示例
{
"task_name": "任务名称",
"arg1": "参数1",
"arg2": "参数2",
"task_cron": "*/2 * * * *"
}
"""
task_name = request.data.get("task_name")
cron_value = request.data.get("task_cron")
cron_list = str(cron_value).split(' ')
if len(cron_list) != 5:
return Response(
{
'data': [],
'status': status.HTTP_400_BAD_REQUEST,
'message': 'cron is not correct, example: */2 * * * *'
}
)
# 创建或更新CrontabSchedule
schedule, _ = CrontabSchedule.objects.get_or_create(
minute=cron_list[0],
hour=cron_list[1],
day_of_week=cron_list[2],
day_of_month=cron_list[3],
month_of_year=cron_list[4],
)
if PeriodicTask.objects.filter(name=task_name).exists():
return Response(
{
'data': [],
'status': status.HTTP_400_BAD_REQUEST,
'message': 'task name already exists'
}
)
periodic_task = PeriodicTask.objects.create(
crontab=schedule,
name=task_name,
task='drfUser.tasks.run_test_task',
)
periodic_task.enabled = True
periodic_task.save()
return Response(
{
'status': status.HTTP_200_OK,
'message': 'success'
}
)
5.启动服务:
启动django项目:python manage.py runserver
启动worker:celery -A drf worker --loglevel=info -P eventlet #注意:Windows启动worker要使用 eventlet,不加无法执行任务
启动beat:celery -A drf beat--loglevel=info