如何在Django中每天一次在准确的时间执行命令?

时间:2012-08-12 17:52:09

标签: python django django-models scheduled-tasks pytz

我正在开发基于Django web的项目,我需要构建一个按以下顺序工作的应用程序:

1)用户打开一个页面,在该页面中他需要输入commandtime

2)Django应用程序将在每天的给定时间执行该命令,直到用户离开调度程序(默认为True)

我面临的问题是:

1)我应该如何在每个时间执行命令但每天都执行命令。为了保存命令和时间,我在models.py

中创建了以下模型
class commands(models.Model):
    username = models.ForeignKey(User)
    command = models.CharField(max_length=30)
    execution_time = models.DateField()

我有相同的时间,但我没有在给定的时间每天执行它的正确方法

是否可以使用pytz库?

执行我正在使用paramiko

的命令

PS:我不想使用任何外部库

3 个答案:

答案 0 :(得分:6)

虽然你可以让你的django应用程序添加和删除系统上的cron作业,但另一种更多的django-ish方法是使用Celery。它是一个可以运行同步和异步任务的任务队列系统。

Celery的一个特定功能是计划任务:http://packages.python.org/celery/userguide/periodic-tasks.html

from datetime import timedelta

CELERYBEAT_SCHEDULE = {
    "runs-every-30-seconds": {
        "task": "tasks.add",
        "schedule": timedelta(seconds=30),
        "args": (16, 16)
    },
}

他们还有一个更精细的期间任务版本,可以复制crontab的计划:

from celery.schedules import crontab

CELERYBEAT_SCHEDULE = {
    # Executes every Monday morning at 7:30 A.M
    'every-monday-morning': {
        'task': 'tasks.add',
        'schedule': crontab(hour=7, minute=30, day_of_week=1),
        'args': (16, 16),
    },
}

Celery本身是独立的,但有django-celery特定的verison

此解决方案的好处是您无需编辑和维护系统级cron选项卡。这是一个高度集成到django中的解决方案,用于此用途。

使用cron的巨大胜利也是Celery可以随系统扩展。如果您使用的是基本系统crontab,则任务将位于托管应用程序的服务器上。但是,如果您需要增加站点并在5个Web应用程序节点上运行它,该怎么办?您需要集中该crontab。如果您使用的是Celery,则可以使用large number of options来了解如何传输和存储任务。它本身是分布式的,可以与所有应用程序服务器同步。它是便携式的。

答案 1 :(得分:1)

在我看来,执行此操作的正确方法是编写Django custom command并通过cron执行它。但是你似乎很幸运,因为其他人已经感受到了类似的需求并编写了自定义django应用程序。以django-cron为例。

答案 2 :(得分:0)

您的问题的解决方案是标准cron应用程序(* nix系统上的任务计划程序)。您可以使用cron计划脚本(通过将其添加到crontab)。

如果您的脚本必须在您的Django应用程序环境中执行,则可以告诉他使用setup_environment函数执行此操作。您可以阅读有关Django应用程序here的独立脚本的更多信息。