Как программно генерировать записи сельдерея с сельдереем и Django - PullRequest
11 голосов
/ 04 марта 2012

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

По умолчанию записи берутся из параметра 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')

Данные в БД выглядят корректно, но при запуске демона выдает следующую ошибку:

[2012-03-06 00: 23: 07,926: ПРЕДУПРЕЖДЕНИЕ / Удар] Обработка процесса:
[2012-03-06 00: 23: 07,926: ПРЕДУПРЕЖДЕНИЕ / Удар] Отслеживание (последний вызов последнего):
[2012-03-06 00: 23: 07,926: ПРЕДУПРЕЖДЕНИЕ / Удар] Файл "/usr/lib/python2.7/multiprocessing/process.py", строка 258, в _bootstrap
[2012-03-06 00:23:07 926: ПРЕДУПРЕЖДЕНИЕ / Удар] self.run ()
[2012-03-06 00: 23: 07 927: ПРЕДУПРЕЖДЕНИЕ / Удар] Файл "/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: ПРЕДУПРЕЖДЕНИЕ / Файл Beat] "/ home / dchesterman / Documents / PythonDev /.virtualenvs/ros/local/lib/python2.7/site-packages/celery/beat.py ", строка 403, в начале
[2012-03-06 00: 23: 07,927: ПРЕДУПРЕЖДЕНИЕ / Удар] интервал = self.scheduler.tick ()
[2012-03-06 00: 23: 07,927: ПРЕДУПРЕЖДЕНИЕ / Удар] Файл "/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: ПРЕДУПРЕЖДЕНИЕ / Удар] Файл "/home/dchesterman/Documents/PythonDev/.virtualenvs/ros/local/lib/python2.7/site-packages/celery/beat.py", строка170, в 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] Файл "/home/dchesterman/Documents/PythonDev/.virtualenvs/ros/local/lib/python2.7/site-packages/djcelery/schedulers.py", строка 54, в is_due
[2012-03-0600: 23: 07,928: WARNING / Beat] вернуть self.schedule.is_due (self.last_run_at)
[2012-03-06 00: 23: 07,928: WARNING / Beat] AttributeError: «У объекта NoneType нет атрибута»is_due '

Я не уверен, почему мой график нене использовать значение по умолчанию is_due()

Ответы [ 2 ]

6 голосов
/ 25 апреля 2012

Вот что у меня получилось:

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.

1 голос
/ 04 марта 2012

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

...