如何用芹菜和Django以编程方式生成芹菜条目 [英] How to programmatically generate celerybeat entries with celery and Django

查看:183
本文介绍了如何用芹菜和Django以编程方式生成芹菜条目的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我希望能够以编程方式生成芹菜条目,并在添加条目时重新同步芹菜。文档此处状态


默认情况下,条目取自CELERYBEAT_SCHEDULE设置,但也可以使用自定义存储,例如将条目存储在SQL数据库中。


所以我试图弄清楚我需要扩展哪些类才能做到这一点。



我一直在看芹菜调度程序文档 djcelery api docs ,但是关于这些方法所做的一些方面的文档是不存在的,所以要潜入一些来源,只是希望有人能指出我在右边方向。



我想我正在做的一个很高的水平将是有帮助的...作为一个用户,我需要能够从预定义的任务集中选择并为我们提供一条路呃选择某种自定义的日程表来执行,就像每一天/每周/每个月一样的日子和时间。



这也是Django中的djcelery。 / p>

更新



我看到djcelery管理员的代码,但不清楚数据的持续存在。我目前有一个通用的 addTask 视图,如下所示:

  def addTask(request):

intervalSchedule = IntervalSchedule.from_schedule(schedule(timedelta(seconds = 10)))
intervalSchedule.save()
modelData = dict(
name =dcTestPersist,
task =technologytrackerapi.views.createRecord,
schedule = intervalSchedule,

periodicTask = PeriodicTask(** modelData)
periodicTask .save()
返回render_to_response('taskView.html')

数据看起来正确在数据库中,但是当守护程序运行时会出现以下错误:


[2012-03-06 00:23:07,926:警告/打]过程节拍:

[2012-03-06 00:23:07,926:警告/节拍]追溯(最近的最近电话):

[2012-03-06 00: 23:07,926:WARNING / Beat]文件/usr/lib/python2.7/multiprocessing/process.py,第258行_bootstrap

[2012-03-06 00:23:07,926:警告/打死]自我。 run()

[2012-03-06 00:23:07,927:警告/ Beat]文件/home/dchesterman/Documents/PythonDev/.virtualenvs/ros/local/lib/python2.7/ site-packages / celery / beat.py,第464行,运行

[2012-03-06 00:23:07,927:WARNING / Beat] self.service.start(embedded_process = True) br>
[2012-03-06 00:23:07,927:警告/ Beat]文件/ home / dchesterman / Documents / PythonDev /.virtualenvs/ros/local/lib/python2.7/site-packages/芹菜/ beat.py,403行,开始

[2012-03-06 00:23:07,927:警告/节拍] interval = self.scheduler.tick()

[2012-03-06 00:23:07,927:WARNING / Beat] File/home/dchesterman/Documents/PythonDev/.virtualenvs/ros/local/lib/python2.7/site-packages/celery/beat.py ,行194,在刻度上

[2012-03-06 00:23:07,927:警告/打败] next_time_to_run = self.maybe_due(entry,self.publisher)

[ 2012-03-06 00:23:07,927:WARNING / Beat]文件/home/dchesterman/Documents/PythonDev/.virtualenvs/ros/local/lib/python2.7/site-packages/celery/beat.py,升ine 170,in maybe_due

[2012-03-06 00:23:07,927:警告/打败] is_due,next_time_to_run = entry.is_due()

[2012-03-06 00:23:07,928:WARNING / Beat]文件/home/dchesterman/Documents/PythonDev/.virtualenvs/ros/local/lib/python2.7/site-packages/djcelery/schedulers.py,第54行is_due

[2012-03-06 00:23:07,928:WARNING / Beat] return self.schedule.is_due(self.last_run_at)

[2012-03-06 00:23 :07,928:WARNING / Beat] AttributeError:'NoneType'对象没有属性'is_due'


我不知道为什么我的日程安排不使用默认的 is_due()

解决方案

为我工作:

  def addTask(request):

intervalSchedule = IntervalSchedule.from_schedule(schedule (timedelta(seconds = 10)))
intervalSchedule.save()

modelData = dict(
name =dcTestPersist,
task =technologytrac kerapi.tasks.createRecord,
interval_id = intervalSchedule.pk,


periodicTask = PeriodicTask(** modelData)
periodicTask.save()

me = ModelEntry(periodicTask)

try:
me.save()

除了:
从django.db导入连接
print connection.queries
raise

返回render_to_response('taskView.html')

我不得不在ModelEntry中包装定期任务。


I am hoping to be able to programmatically generate celerybeat entries and resync celerybeat when entries are added. The docs here state

By default the entries are taken from the CELERYBEAT_SCHEDULE setting, but custom stores can also be used, like storing the entries in an SQL database.

So I am trying to figure out which classes i need to extend to be able to do this.

I have been looking at celery scheduler docs and djcelery api docs but the documentation on what some of these methods do is non-existent so about to dive into some source and was just hoping someone could point me in the right direction.

I guess a high level of what I'm doing would be helpful... As a user I need to be able to select from a predefined set of tasks and provide a way for a user to select some sort of custom schedule for it to execute, like every day/week/month and what day and time.

Also this is in Django with djcelery.

UPDATE

I see the code for the djcelery admin but am not clear on how that data is being persisted. I currently have a generic addTask view that looks like this :

def addTask(request):

intervalSchedule = IntervalSchedule.from_schedule(schedule(timedelta(seconds=10)))
intervalSchedule.save()
modelData = dict(
    name="dcTestPersist",
    task="technologytrackerapi.views.createRecord",
    schedule=intervalSchedule,
)
periodicTask = PeriodicTask(**modelData)
periodicTask.save()
return render_to_response('taskView.html')

The data looks correct in the db but when the daemon runs it has this error :

[2012-03-06 00:23:07,926: WARNING/Beat] Process Beat:
[2012-03-06 00:23:07,926: WARNING/Beat] Traceback (most recent call last):
[2012-03-06 00:23:07,926: WARNING/Beat] File "/usr/lib/python2.7/multiprocessing/process.py", line 258, in _bootstrap
[2012-03-06 00:23:07,926: WARNING/Beat] self.run()
[2012-03-06 00:23:07,927: WARNING/Beat] File "/home/dchesterman/Documents/PythonDev/.virtualenvs/ros/local/lib/python2.7/site-packages/celery/beat.py", line 464, in run
[2012-03-06 00:23:07,927: WARNING/Beat] self.service.start(embedded_process=True)
[2012-03-06 00:23:07,927: WARNING/Beat] File "/home/dchesterman/Documents/PythonDev /.virtualenvs/ros/local/lib/python2.7/site-packages/celery/beat.py", line 403, in start
[2012-03-06 00:23:07,927: WARNING/Beat] interval = self.scheduler.tick()
[2012-03-06 00:23:07,927: WARNING/Beat] File "/home/dchesterman/Documents/PythonDev/.virtualenvs/ros/local/lib/python2.7/site-packages/celery/beat.py", line 194, in tick
[2012-03-06 00:23:07,927: WARNING/Beat] next_time_to_run = self.maybe_due(entry, self.publisher)
[2012-03-06 00:23:07,927: WARNING/Beat] File "/home/dchesterman/Documents/PythonDev/.virtualenvs/ros/local/lib/python2.7/site-packages/celery/beat.py", line 170, in maybe_due
[2012-03-06 00:23:07,927: WARNING/Beat] is_due, next_time_to_run = entry.is_due()
[2012-03-06 00:23:07,928: WARNING/Beat] File "/home/dchesterman/Documents/PythonDev/.virtualenvs/ros/local/lib/python2.7/site-packages/djcelery/schedulers.py", line 54, in is_due
[2012-03-06 00:23:07,928: WARNING/Beat] return self.schedule.is_due(self.last_run_at)
[2012-03-06 00:23:07,928: WARNING/Beat] AttributeError: 'NoneType' object has no attribute 'is_due'

I'm not sure why my schedule does not use the default is_due()

解决方案

This is what ended up working for me :

def addTask(request):

  intervalSchedule = IntervalSchedule.from_schedule(schedule(timedelta(seconds=10)))
  intervalSchedule.save()

  modelData = dict(
      name="dcTestPersist",
      task="technologytrackerapi.tasks.createRecord",
      interval_id=intervalSchedule.pk,
  )

  periodicTask = PeriodicTask(**modelData)
  periodicTask.save()

  me = ModelEntry(periodicTask)

  try:
      me.save()

  except:
    from django.db import connection
    print connection.queries
    raise

  return render_to_response('taskView.html')

I had to wrap the Periodic Task in a ModelEntry.

这篇关于如何用芹菜和Django以编程方式生成芹菜条目的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆