我正在开发基于Django web的项目,我需要构建一个按以下顺序工作的应用程序:
1)用户打开一个页面,在该页面中他需要输入command
和time
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:我不想使用任何外部库
答案 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的独立脚本的更多信息。