TM.*_*TM. 491 python django web-applications scheduled-tasks
我一直在使用Django开发一个Web应用程序,我很好奇是否有办法安排作业定期运行.
基本上我只是想通过数据库运行并自动定期进行一些计算/更新,但我似乎无法找到任何关于这样做的文档.
有谁知道如何设置它?
澄清:我知道我可以设置一个cron工作来做这件事,但我很好奇Django中是否有一些提供此功能的功能.我希望人们能够自己部署这个应用程序而无需进行太多配置(最好是零).
我已经考虑通过简单地检查自上次将请求发送到网站后是否应该运行作业来"追溯"触发这些操作,但我希望有一些更清洁的东西.
Bri*_*eal 344
我采用的一个解决方案是:
1)创建自定义管理命令,例如
python manage.py my_cool_command
Run Code Online (Sandbox Code Playgroud)
2)使用cron(在Linux上)或at(在Windows上)在所需的时间运行我的命令.
这是一个简单的解决方案,不需要安装繁重的AMQP堆栈.然而,使用像其他答案中提到的Celery这样的东西有很好的优势.特别是,使用Celery,不必将应用程序逻辑扩展到crontab文件中.但是,cron解决方案适用于中小型应用程序,并且您不需要大量外部依赖项.
编辑:
在Windows的更高版本中,at不推荐使用Windows 8,Server 2012及更高版本的命令.您可以使用schtasks.exe相同的用途.
cha*_*hra 50
我们开源了我认为的结构化应用程序.上面Brian的解决方案也提到了.会喜欢任何/所有反馈!
https://github.com/tivix/django-cron
它带有一个管理命令:
./manage.py runcrons
Run Code Online (Sandbox Code Playgroud)
这样做了.每个cron都被建模为一个类(因此它的所有OO),每个cron以不同的频率运行,我们确保相同的cron类型不会并行运行(如果crons本身需要比它们的频率更长的运行时间!)
谢谢!
Van*_*ale 22
有趣的新插件Django app:django-计时码表
你只需添加一个作为计时器的cron条目,你就可以在脚本中运行一个非常好的Django管理界面.
use*_*767 15
看看Django Poor Man的Cron,这是一个Django应用程序,它使用spambots,搜索引擎索引机器人等,大约定期运行计划任务
请参阅:http://code.google.com/p/django-poormanscron/
Brian Neal关于通过cron运行管理命令的建议很有效,但是如果你正在寻找一些更强大的东西(但不像Celery那么精细),我会调查像Kronos这样的库:
# app/cron.py
import kronos
@kronos.register('0 * * * *')
def task():
pass
Run Code Online (Sandbox Code Playgroud)
用于调度程序作业的 Django APScheduler。Advanced Python Scheduler (APScheduler) 是一个 Python 库,可让您安排 Python 代码稍后执行,可以只执行一次,也可以定期执行。您可以随意添加新工作或删除旧工作。
注意:我是这个库的作者
pip install apscheduler
Run Code Online (Sandbox Code Playgroud)
文件名:scheduler_jobs.py
def FirstCronTest():
print("")
print("I am executed..!")
Run Code Online (Sandbox Code Playgroud)
制作execute.py文件并添加以下代码
from apscheduler.schedulers.background import BackgroundScheduler
scheduler = BackgroundScheduler()
Run Code Online (Sandbox Code Playgroud)
你写的函数在这里,调度器函数写在 scheduler_jobs 中
import scheduler_jobs
scheduler.add_job(scheduler_jobs.FirstCronTest, 'interval', seconds=10)
scheduler.start()
Run Code Online (Sandbox Code Playgroud)
现在,在 Url 文件的底部添加以下行
import execute
Run Code Online (Sandbox Code Playgroud)
我刚才有完全相同的要求,最后用APScheduler解决了这个问题(用户指南)
它使调度作业变得非常简单,并使其与基于请求的某些代码执行保持独立.以下是我在代码中使用的一个简单示例.
from apscheduler.schedulers.background import BackgroundScheduler
scheduler = BackgroundScheduler()
job = None
def tick():
print('One tick!')\
def start_job():
global job
job = scheduler.add_job(tick, 'interval', seconds=3600)
try:
scheduler.start()
except:
pass
Run Code Online (Sandbox Code Playgroud)
希望这有助于某人!
将以下内容放在cron.py文件的顶部:
#!/usr/bin/python
import os, sys
sys.path.append('/path/to/') # the parent directory of the project
sys.path.append('/path/to/project') # these lines only needed if not on path
os.environ['DJANGO_SETTINGS_MODULE'] = 'myproj.settings'
# imports and code below
Run Code Online (Sandbox Code Playgroud)
我只是想到了这个相当简单的解决方案:
您可以添加参数,但只需向URL添加参数即可.
告诉我你们的想法.
[更新]我现在使用django-extensions而不是curl的runjob命令.
我的cron看起来像这样:
@hourly python /path/to/project/manage.py runjobs hourly
Run Code Online (Sandbox Code Playgroud)
......等等每日,每月等等.您也可以将其设置为运行特定作业.
我发现它更容易管理,更清洁.不需要将URL映射到视图.只需定义你的工作类和crontab就可以了.
| 归档时间: |
|
| 查看次数: |
154936 次 |
| 最近记录: |