4

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

1)用户打开一个页面,他需要在其中输入acommand和atime

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:我不想使用任何外部库

4

3 回答 3

10

虽然您可以让您的 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),
    },
}

芹菜本身是独立的,但有django-celery特定的版本

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

使用 cron 的另一个巨大优势是 Celery 可以随您的系统扩展。如果您使用的是基本系统 crontab,那么任务将位于托管应用程序的服务器上。但是,如果您需要扩展您的网站并在 5 个 Web 应用程序节点上运行它怎么办?您需要集中该 crontab。如果您使用的是 Celery,您有很多关于如何传输和存储任务的选项。它本质上是分布式的,并且可以同步到您的所有应用程序服务器。它是便携式的。

于 2012-08-12T18:01:03.473 回答
2

在我看来,正确的方法是编写一个Django 自定义命令并通过 cron 执行它。但是您似乎很幸运,因为其他人也有类似的需求并编写了自定义 django 应用程序。以django-cron为例。

于 2012-08-12T18:00:48.217 回答
0

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

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

于 2012-08-12T18:00:39.797 回答