django+django_celery_beat动态定时任务


typora-root-url: ./

django+django_celery_beat动态定时任务

一、创建django项目

二、下载celery相关依赖包

celery
django_celery_beat
django-redis
django_celery_results
eventlet

三、配置django_celery_beat

1、settings配置

INSTALLED_APPS = [
    ......
    'django_celery_beat',# pip install django-celery-beat
    'django_celery_results',# 查看 celery 执行结果
	.....
]

2、迁移到数据库

python manage.py magemigrations
python manage.py migrate

迁移完成可以看到:

在这里插入图片描述在这里插入图片描述

3、celery配置

在settings.py 同一级目录下创建:celery.py

from __future__ import absolute_import, unicode_literals

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

# 设置Django项目的默认设置模块
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'xidida_comprehensive.settings')
app = Celery(f'xidida_comprehensive')
# 使用Django的设置模块配置Celery  
# app.config_from_object('django.conf:settings', namespace='CELERY')
# 使用配置
app.config_from_object('django.conf:settings')

# 自动发现任务模块
app.autodiscover_tasks(lambda: settings.INSTALLED_APPS)
platforms.C_FORCE_ROOT = True

settings.py中增加配置

''' 数据库配置 '''
DATABASE_TYPE= "MySQL"
DATABASES_ENGINE = "django.db.backends.mysql"
DATABASES_NAME = "xidida_comprehensive"  # 数据库名称
DATABASES_PORT = 3306  # 端口
DATABASES_USER = "root"  # 数据库用户名
DATABASES_PASSWORD = "123456"# 数据库密码
DATABASES_HOST = "127.0.0.1" # 数据库端口

''' redis 配置 '''
REDIS_HOST = '127.0.0.1'
REDIS_PASSWORD = '123456' # 密码
REDIS_DB = 1
# celery 定时任务redis 库号
REDIS_PORT = 6380  # 端口
CELERY_DB = 2  # celery 库编号


# 数据库配置
if DATABASE_TYPE=="MySQL":
    DATABASES = {
        'default': {
            'ENGINE': DATABASES_ENGINE,
            'NAME': DATABASES_NAME,
            'USER': DATABASES_USER,
            'PASSWORD': DATABASES_PASSWORD,
            'PORT': DATABASES_PORT,
            'HOST': DATABASES_HOST,
        }
    }
else:
    DATABASES = {
        'default': {
            'ENGINE': 'django.db.backends.sqlite3',
            'NAME': BASE_DIR / 'db.sqlite3',
        }
    }

    



# redis 缓存
REDIS_URL = f'redis://:{REDIS_PASSWORD if REDIS_PASSWORD else ""}@{os.getenv("REDIS_HOST") or REDIS_HOST}:{REDIS_PORT}/{REDIS_DB}'
# 是否启用redis
if locals().get("REDIS_ENABLE", True):
    CACHES = {
        "default": {
            "BACKEND": "django_redis.cache.RedisCache",
            "LOCATION": REDIS_URL,
            "OPTIONS": {
                "CLIENT_CLASS": "django_redis.client.DefaultClient",
            }
        },
    }


#  celery 配置
BROKER_URL = f'redis://:{REDIS_PASSWORD if REDIS_PASSWORD else ""}@{os.getenv("REDIS_HOST") or REDIS_HOST}:' \
             f'{REDIS_PORT}/{locals().get("CELERY_DB", 2)}'  # Broker使用Redis
CELERYBEAT_SCHEDULER = 'django_celery_beat.schedulers.DatabaseScheduler'  # Backend数据库
DJANGO_CELERY_BEAT_TZ_AWARE = False
CELERY_TIMEZONE = 'Asia/Shanghai'  # celery 时区问题


4、创建app

python manage.py startapp task_app

在这里插入图片描述

在APP下创建 tasks.py 文件

# -*- coding: utf-8 -*-
'''
@date:2023/6/26 13:45
@email:2654152420@qq.com
@author:小纯
@Content:
'''
from __future__ import absolute_import, unicode_literals
from celery import shared_task

@shared_task
def add():
    print("定时任务add执行")
    return 0

@shared_task
def mul():
    print("定时任务 mul 执行")
    return 0

5、创建超级用户,进行配置定时任务

5.1 配置超级用户

python manage.py createsuperuser

访问:http://127.0.0.1:8000/admin/

登陆后进入:

在这里插入图片描述
在这里插入图片描述

5.2、设置时间间隔

可以设也可以不设置,到5.3中进行其他设置即可

在这里插入图片描述

5.3设置任务

在这里插入图片描述

在这里插入图片描述

最后保存即可;

注意:在这里设置Schedule

在这里插入图片描述

6、启动

beat是一个定时任务调度器,它会定期向消息队列发送任务。

worker是Celery的消费者,它会从消息队列中获取任务并执行。

beat的作用是周期性地向消息队列发送任务,而worker的作用是接收这些任务并执行它们。

6.1 启动beat

# xidida_comprehensive 项目名
celery  -A xidida_comprehensive  beat -l info

在这里插入图片描述

6.2 启动 work

# xidida_comprehensive 项目名
启动worker
 # Linux下测试,启动Celery
 Celery -A xidida_comprehensive worker -l info
 
 # Windows下测试,启动Celery
 Celery -A xidida_comprehensive worker -l info -P eventlet
 
 # 如果Windows下Celery不工作,输入如下命令
 Celery -A xidida_comprehensive worker -l info --pool=solo

在这里插入图片描述

总结

卓越笔记

要实现可前端添加定时任务,可以使用 Djangocelery_beat 库和 MySQL 数据库。 首先,需要安装 celerycelery_beat 库: ``` pip install celery django-celery-beat ``` 然后,在 Django 的 settings.py 文件中设置 celerycelery_beat 的相关配置: ```python # 配置 celery CELERY_BROKER_URL = 'redis://localhost:6379/0' CELERY_RESULT_BACKEND = 'redis://localhost:6379/0' # 配置 celery_beat CELERY_BEAT_SCHEDULER = 'django_celery_beat.schedulers:DatabaseScheduler' ``` 接下来,创建一个 app,用于存储定时任务的配置信息。这里假设 app 名称为 `tasks`,在 models.py 中定义一个 `Task` 模型: ```python from django.db import models class Task(models.Model): name = models.CharField(max_length=256) task = models.CharField(max_length=256) args = models.TextField(default='[]') kwargs = models.TextField(default='{}') schedule = models.CharField(max_length=256) ``` 这个模型包含了任务的名称、任务函数、参数、关键字参数和调度器配置信息。 接下来,需要在 app 的 admin.py 文件中注册 `Task` 模型,并自定义 admin 页面的表单。这里使用 `JSONEditorWidget` 来渲染参数和关键字参数的输入框: ```python from django.contrib import admin from django_json_widget.widgets import JSONEditorWidget from .models import Task @admin.register(Task) class TaskAdmin(admin.ModelAdmin): formfield_overrides = { models.TextField: {'widget': JSONEditorWidget}, } ``` 现在,可以在 admin 页面中添加、删除、修改定时任务的配置信息了。但是,这些配置信息并没有被 celery_beat 调度器使用。为了让 celery_beat 调度器能够使用这些信息,需要在 app 的 `apps.py` 文件中注册定时任务: ```python from django.apps import AppConfig from django.conf import settings from celery import Celery from celery.schedules import crontab from .models import Task class TasksConfig(AppConfig): name = 'tasks' def ready(self): # 创建 celery 实例 app = Celery('tasks', broker=settings.CELERY_BROKER_URL) # 获取所有定时任务配置信息 tasks = Task.objects.all() # 注册定时任务 for task in tasks: app.conf.beat_schedule[task.name] = { 'task': task.task, 'schedule': crontab(task.schedule), 'args': eval(task.args), 'kwargs': eval(task.kwargs), } ``` 这里通过 `AppConfig.ready()` 方法,在 app 启动时注册定时任务。在注册任务时,需要将 `args` 和 `kwargs` 字段的字符串转换成 Python 对象。最后,需要在项目的 __init__.py 文件中配置 app 的默认 AppConfig: ```python default_app_config = 'tasks.apps.TasksConfig' ``` 现在,就可以启动 celerycelery_beat 服务了: ``` celery -A proj worker -l info celery -A proj beat -l info ``` 启动服务后,即可根据 admin 页面上的定时任务配置信息自动调度任务了。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值