Celery beat_schedule, используя неправильный часовой пояс - PullRequest
0 голосов
/ 09 ноября 2019

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

Соответствующие настройки в ./settings.py:

TIME_ZONE = 'Europe/London'
USE_TZ = True
CELERY_ENABLE_UTC = False
CELERY_TIMEZONE = TIME_ZONE

Мой конфиг сельдерея в ./my_project/celery.py:

from django.utils import timezone
from celery import Celery
from celery.schedules import crontab


app = Celery('my_project')
app.config_from_object('django.conf:settings', namespace='CELERY')
app.autodiscover_tasks()

# Configure daily tasks
app.conf.beat_schedule = {
    # Executes `my_task` every day at 10:00am
    'do-my-task': {
        'task': 'tasks.tasks.my_task',
        'schedule': crontab(minute=0, hour=10),
        'args': (timezone.now().strftime('%d/%m/%Y'), ),
    },
}

Любые идеи, почему следует вводить неверную строку даты в качестве аргумента my_task?

1 Ответ

0 голосов
/ 10 ноября 2019

django.utils.timezone.now не делает то, что вы думаете, что делает. Согласно документам будет возвращено время в формате UTC с часовым поясом, установленным в UTC. Он не вернет время в Europe/London, как вы хотите:

Если USE_TZ равно True, это будет знать datetime представляет текущее время в UTC. Обратите внимание, что now() всегда будет возвращать время в UTC независимо от значения TIME_ZONE;Вы можете использовать localtime(), чтобы получить время в текущем часовом поясе.

В соответствии с документацией используйте localtime вместо now.

...