отредактировано! это может быть простое решение, вы можете использовать сигнал (например, post_save) в модели для вызова функции set_published, поэтому она будет вызываться при каждом сохранении статьи.

ти хранятся в базе данных MySQL сdatetime публикации.

В любой момент пользователь может добавить новое в таблицу с задержкой публикации даты.

Как использовать Celery для просмотра таблицы базы данных и проверки того, пора ли публиковать данные?

За публикацию данных отвечает другой процесс (скрипт Python). Поэтому Celery должен вызывать этот скрипт для каждой строки в таблице MySQL в соответствииdatetime.

Как это сделать с помощью сельдерея?

Еще один способ, я думаю, чтобы создать очередь сdate а такжеid публикации, затем напрямую добавьте данные из формы пользователя в эту очередь. Следовательно, должен быть процесс (Celery), который наблюдает за очередью для дальнейшего выполнения задач по дате.

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

Извините, если вопрос тривиальный, я новичок в Python Celery.

 schwobaseggl25 нояб. 2017 г., 19:59
Это также возможно, хотя перехват для сохранения более безопасен, например, если даты публикации меняются любым другим способом, например через консоль.
 schwobaseggl25 нояб. 2017 г., 19:45
Вы могли бы подключиться кsave или подключиться кpost_save сигнал, и вызовите вашу задачу публикации черезapply_async(eta=instance.publish_date), Конечно, сама задача должна перепроверяться, если дата не изменилась.
 schwobaseggl25 нояб. 2017 г., 19:31
Вы можете запланировать ежедневное задание, которое публикует все публикации, чья дата публикацииtoday()
 Oleg25 нояб. 2017 г., 19:48
Вы имеете в виду задачу aync call сразу после отправки формы?
 Oleg25 нояб. 2017 г., 19:33
Мне это не нужно, мне нужно планировать задачи, используя данные, хранящиеся в базе данных MySQL, и немедленно выполнять это вовремя. Также база данных может быть расширена на новые даты. Так что Сельдери должен знать об этом в срочном порядке. Вы должны использовать статическую конкретную дату. Это не подходит для меня.

Ответы на вопрос(1)

eta наapply_async() (Ссылаться наhttp://docs.celeryproject.org/en/latest/userguide/calling.html#eta-and-countdown)

Параметр eta должен быть в формате datetime, поэтому он будет работать с точностью до миллисекунды.

Я рекомендую вам использовать ORM, поэтому тип данных datetime из вашей базы данных будет автоматически преобразован в ORM: D

скажем, у нас естьСтатья модель:

class Article(models.Model):
    title = models.CharField(max_length=100)
    published = models.BooleanField(default=False)
    created_date = models.DateTimeField()

а потом нашзадачи модуль:

@app.task(bind=True)
def set_published(*args, **kwargs):
    article = Article.objects.get(id=args[1])
    article.published = True
    article.save()

    print("article %d has been published" % args[1])

Сохраните новую статью и позвонитеset_published с участиемрасчетное время прибытия+ 1мин

article = Article(title='This is a new article', published=False, created_date=datetime.utcnow())
article.save()

delta = timedelta(minutes=1)
set_published.apply_async(args=(article.id,), eta=article.created_date + delta)
 Oleg26 нояб. 2017 г., 00:25
Можете поделиться кратким примером кода?
 HQM26 нояб. 2017 г., 04:45
отредактировано! это может быть простое решение, вы можете использовать сигнал (например, post_save) в модели для вызова функции set_published, поэтому она будет вызываться при каждом сохранении статьи.

Ваш ответ на вопрос