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

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

1)用户打开一个页面,在该页面中他需要输入命令和时间

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

最佳答案 虽然您可以让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特定的verison

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

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

点赞