使用django_celery_beat、mysql实现可前端添加定时任务
时间: 2024-02-01 21:15:32 浏览: 169
要实现可前端添加定时任务,可以使用 Django 的 celery_beat 库和 MySQL 数据库。
首先,需要安装 celery 和 celery_beat 库:
```
pip install celery django-celery-beat
```
然后,在 Django 的 settings.py 文件中设置 celery 和 celery_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'
```
现在,就可以启动 celery 和 celery_beat 服务了:
```
celery -A proj worker -l info
celery -A proj beat -l info
```
启动服务后,即可根据 admin 页面上的定时任务配置信息自动调度任务了。
阅读全文