Как программно генерировать записи celerybeat с сельдереем и Django

Я надеюсь, что у вас будет возможность программно генерировать записи celerybeat и resync celerybeat при добавлении записей. Документы here state

По умолчанию записи берутся из параметра CELERYBEAT_SCHEDULE, но также могут использоваться пользовательские хранилища, например, сохранение записей в базе данных SQL.

Итак, я пытаюсь выяснить, какие классы мне нужно расширить, чтобы иметь возможность сделать это.

Я смотрел документы планировщика сельдерея и djcelery api docs, но документация о том, что некоторые из эти методы не существуют, поэтому нужно погрузиться в какой-то источник и просто надеялись, что кто-то может указать мне в правильном направлении.

Я предполагаю, что высокий уровень того, что я делаю, будет полезен... Как пользователь, я должен иметь возможность выбирать из предопределенного набора задач и предоставлять пользователю возможность выбрать какое-то пользовательское расписание для его выполнения, например, каждый день/неделю/месяц и в какой день и время.

Также это в Django с djcelery.

ОБНОВЛЕНИЕ

Я вижу код для администратора 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()
return render_to_response('taskView.html')

Данные выглядят корректно в db, но когда демон работает, эта ошибка:

[2012-03-06 00: 23: 07,926: WARNING/Beat] Процесс Beat:
[2012-03-06 00: 23: 07,926: WARNING/Beat] Traceback (последний последний звонок):
[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: WARNING/Beat] self.run()
[2012-03-06 00: 23: 07,927: WARNING/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)
[2012-03-06 00: 23: 07,927: WARNING/Beat] Файл "/home/dchesterman/Documents/PythonDev/.virtualenvs/ros/local/lib/python2.7/site-packages/celery/beat.py", строка 403, в начало
[2012-03-06 00: 23: 07,927: WARNING/Beat] interval = self.scheduler.tick()
[2012-03-06 00: 23: 07,927: WARNING/Beat] Файл "/home/dchesterman/Documents/PythonDev/.virtualenvs/ros/local/lib/python2.7/site-packages/celery/beat.py", строка 194, в тике
[2012-03-06 00: 23: 07,927: WARNING/Beat] next_time_to_run = self.maybe_due (запись, 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", строка 170, в may_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] Файл "/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()

Ответ 1

Вот что закончилось для меня:

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')

Мне пришлось обернуть периодическую задачу в ModelEntry.

Ответ 2

Я думаю, что вы хотите добавить PeriodicTask в базу данных. Похоже, что нижняя часть https://github.com/ask/django-celery/blob/master/djcelery/admin.py заключается в том, как они добавляют в задачи администратора - вам нужно будет предложить нечто подобное на передней панели конец.