我正在开发一个基于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来了解如何运输和存储任务.它本身是分布式的,可以与所有应用程序服务器同步.它是便携式的.