关于Django使用 django-celery-beat动态添加定时任务的方法

关于Django使用django-celery-beat动态添加定时任务的方法

Django是一个开放源代码的高层次Python Web框架。开发人员可以利用Django的许多条款和模块来开发完整的Web应用程序。而celery是Python语言使用的一个异步任务队列,它轻量级、高效,可靠,非常适用于处理高并发的异步任务。而django-celery-beat则是一个Celery Beat调度器的Django扩展,提供了在Django admin界面中管理定时任务的功能。在本攻略中,我们将讲述如何使用django-celery-beat动态添加定时任务的方法。

环境要求

在开始之前,您需要准备如下环境:
1. Python 2.7或3.4以上版本
2. Django 1.11或更高版本
3. celery 4.2.0或更高版本
4. django-celery-beat 1.4.0或更高版本

步骤一:添加django-celery-beat

在终端中运行以下命令安装django-celery-beat:

pip install django-celery-beat

然后,在您的项目的settings.py文件中添加如下配置:

INSTALLED_APPS = (
    ...
    'django_celery_beat',
    ...
)

CELERY_BEAT_SCHEDULER = 'django_celery_beat.schedulers:DatabaseScheduler'

步骤二:创建定时任务模型

首先,在您的项目中创建一个tasks.py文件。在tasks.py文件中,定义以下两个定时任务:

from celery import shared_task
@shared_task
def task_one():
    print('Task One Done.')
    return 'Task One Done.'

@shared_task
def task_two():
    print('Task Two Done.')
    return 'Task Two Done.'

接着,在您的项目models.py文件中定义如下模型:

from django.db import models
from django_celery_beat.models import PeriodicTask, IntervalSchedule, CrontabSchedule

class DynamicTask(models.Model):
    name = models.CharField(max_length=50)
    active = models.BooleanField(default=True)
    run_at = models.DateTimeField()
    interval_schedule = models.ForeignKey(IntervalSchedule, on_delete=models.CASCADE, blank=True, null=True)
    crontab_schedule = models.ForeignKey(CrontabSchedule, on_delete=models.CASCADE, blank=True, null=True)
    task = models.CharField(max_length=50)

在该模型中,定义了DynamicTask对象,它包含一些字段:
1. name: 任务的名称
2. active: 是否启用该任务的标志(默认为True)
3. run_at: 任务的下一次执行时间
4. interval_schedule: 任务的间隔调度(如果是周期性任务)
5. crontab_schedule: 任务的Crontab调度(如果是定时任务)
6. task: 执行任务的函数名

步骤三:添加定时任务视图和表单

接着,在您的项目views.py文件中添加以下视图和表单:

from django.shortcuts import render, redirect
from .forms import DynamicTaskForm
from .models import DynamicTask, IntervalSchedule, CrontabSchedule
from celery import current_app
from datetime import datetime

def home(request):
    tasks = DynamicTask.objects.all()
    return render(request, 'home.html', {'tasks': tasks})

def add_task(request):
    if request.method == 'POST':
        form = DynamicTaskForm(request.POST)
        if form.is_valid():
            task = form.save(commit=False)
            task.run_at = datetime.now()  # 设置任务的起始执行时间为当前时间
            task.save()
            current_app.conf.beat_schedule[str(
                task.id)] = {'task': task.task, 'schedule': task.schedule}
            return redirect('home')
    else:
        form = DynamicTaskForm()
    return render(request, 'add_task.html', {'form': form})

from django import forms
from .models import DynamicTask, IntervalSchedule, CrontabSchedule

class DynamicTaskForm(forms.ModelForm):
    interval = forms.CharField(
        widget=forms.Select(choices=(
            ('days', 'Days'),
            ('hours', 'Hours'),
            ('minutes', 'Minutes')
        ))
    )

    week_days = forms.MultipleChoiceField(
        required=False,
        widget=forms.CheckboxSelectMultiple,
        choices=(
            (0, 'Monday'),
            (1, 'Tuesday'),
            (2, 'Wednesday'),
            (3, 'Thursday'),
            (4, 'Friday'),
            (5, 'Saturday'),
            (6, 'Sunday')
        )
    )

    class Meta:
        model = DynamicTask
        fields = ['name', 'active', 'task', 'interval']

步骤四:添加模板

最后,在您的项目templates文件夹中创建以下HTML模板:
home.html:

{% extends 'base.html' %}

{% block content %}
    <h1>List of Scheduled Tasks</h1>
    <hr>

    <table class="table table-striped">
        <thead>
        <tr>
            <th>Name</th>
            <th>Task</th>
            <th>Active</th>
            <th>Next Run</th>
            <th>Actions</th>
        </tr>
        </thead>

        <tbody>
        {% for task in tasks %}
            <tr>
                <td>{{ task.name }}</td>
                <td>{{ task.task }}</td>
                <td>{{ task.active }}</td>
                <td>{{ task.run_at }}</td>
                <td>
                    <a href="/run_task/{{ task.id }}/" class="btn btn-success">Run Now</a>
                    <a href="/delete_task/{{ task.id }}/" class="btn btn-danger">Delete</a>
                </td>
            </tr>
        {% endfor %}
        </tbody>
    </table>


    <a href="{% url 'add_task' %}" class="btn btn-primary">Add Task</a>

{% endblock %}

add_task.html:

{% extends 'base.html' %}

{% block content %}
    <h1>Add Task</h1>
    <hr>

    <form method="post" class="form">
        {% csrf_token %}
        {{ form.as_p }}

        <button type="submit" class="btn btn-success">Save</button>
        <a href="{% url 'home' %}" class="btn btn-secondary">Cancel</a>
    </form>

{% endblock %}

测试

启动Celery Beat调度器,然后访问首页即可看到已经定义的所有定时任务。单击“Add Task”按钮,我们就可以添加一个新的定时任务。

例如,我们添加如下任务:
1. Task Name: 每分钟执行一次的任务
Task: tasks.task_one
Schedule: Interval(Minutes) = 1

  1. Task Name: 每周一下午4:30执行一次的任务
    Task: tasks.task_two
    Schedule: Crontab - Minute = 30,Hour = 4,Day of week = Monday

执行这两个任务有一下两种方法:

  1. 在模板中通过“Run Now”按钮手动启动任务并查看控制台输出
  2. 在Celery Beat中调度任务

综上,本攻略中详细讲述了如何使用django-celery-beat动态添加定时任务的方法,通过以上的步骤及示例,读者可以灵活地使用django-celery-beat来在Django应用程序中定时执行任务。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:关于Django使用 django-celery-beat动态添加定时任务的方法 - Python技术站

(0)
上一篇 2023年5月25日
下一篇 2023年5月25日

相关文章

  • java使用tess4j进行图片文字识别功能

    以下是使用tess4j进行图片文字识别功能的完整攻略: 简介 Tess4J是基于Tesseract OCR引擎的Java OCR API。它支持OCR引擎的多种语言,并提供了易于使用的API。使用Tess4J可以方便地实现图片文字识别的功能。 步骤 步骤一:引入Tess4J的Jar包 在项目中引入Tess4J的Jar包,可以去官网(https://sourc…

    人工智能概论 2023年5月25日
    00
  • Java单例模式下的MongoDB数据库操作工具类

    那我先简单介绍一下Java单例模式和MongoDB数据库操作。Java单例模式是一种设计模式,它可以确保一个类在整个应用程序中只有一个实例,并且提供了全局访问该实例的方式。而MongoDB是一种非关系型数据库,具有高性能、可伸缩的特点,支持大数据存储和处理。下面我将详细讲解如何在Java单例模式下编写MongoDB数据库操作工具类。 步骤一:创建单例模式类 …

    人工智能概论 2023年5月25日
    00
  • 浅谈多卡服务器下隐藏部分 GPU 和 TensorFlow 的显存使用设置

    标题 浅谈多卡服务器下隐藏部分 GPU 和 TensorFlow 的显存使用设置 背景 在使用多卡服务器进行模型训练时,由于显存限制,可能会出现一部分 GPU 显存不足无法使用,或者需要提前将一些 GPU 预留出来供其他程序使用的情况。本文将提供一些方法来解决这种情况下的显存使用问题。 方案 1. 隐藏部分 GPU 在 Linux 系统下,我们可以使用 CU…

    人工智能概论 2023年5月25日
    00
  • Spring boot 集成Dubbox的方法示例

    下面是关于Spring Boot集成Dubbo的方法示例攻略: 什么是Dubbo Dubbo是阿里巴巴开源的一个高性能的Java RPC框架,主要提供了微服务架构下的远程调用通信能力,解决了分布式服务化架构中的RPC问题。在阿里巴巴内部广泛应用,2011年开源以来也逐渐在国内流行。 在Spring Boot项目中集成Dubbo Dubbo可以通过与Sprin…

    人工智能概览 2023年5月25日
    00
  • 详解python如何在django中为用户模型添加自定义权限

    下面是详解如何在 Django 中为用户模型添加自定义权限的攻略。 1. 概述 在 Django 中,我们可以使用自带的权限系统控制用户对资源的访问,但是这些权限可能不足以满足我们的需求,我们需要自定义权限。本文将介绍如何在 Django 中为用户模型添加自定义权限。 2. 实现步骤 2.1. 定义权限 在 Django 中,权限在 django.contr…

    人工智能概览 2023年5月25日
    00
  • Node.js连接MongoDB数据库产生的问题

    连接MongoDB数据库是Node.js开发的重要环节之一。下面我们将详细讲解在连接MongoDB数据库时可能会出现的问题及其解决办法,供开发者参考。 问题一:安装MongoDB驱动 在使用Node.js连接MongoDB数据库前,需要先安装MongoDB的驱动模块。可以使用npm install mongodb命令进行安装。同时,还需注意模块版本与Mong…

    人工智能概论 2023年5月25日
    00
  • Python 通过截图匹配原图中的位置(opencv)实例

    Python 通过截图匹配原图中的位置(opencv)实例攻略 本文将介绍使用Python中的OpenCV库对原图进行截图匹配,并得到该截图在原图中的位置坐标的方法。OpenCV是一个基于开源发行的跨平台计算机视觉库,常用于图像和视频的处理。 步骤一:导入依赖库 首先需要导入相关的库,在这个实例中,需要导入numpy和OpenCV库,使用命令: import…

    人工智能概论 2023年5月25日
    00
  • 基于OpenCV自定义色条实现灰度图上色功能代码

    自定义色条是一个在图像处理中常用的功能,它可以把灰度图像上的灰度映射至不同的颜色上,从而实现更加直观的图像色彩表达。在OpenCV中可以基于LUT(Lookup Table)实现灰度图上色的功能,具体步骤如下: 创建颜色映射表LUT 首先需要创建一个颜色映射表LUT,这个LUT是一个256×1的彩色矩阵,它定义了当前灰度下的RGB颜色值,用于后续的灰度图像上…

    人工智能概论 2023年5月24日
    00
合作推广
合作推广
分享本页
返回顶部