Указанное время начала периодического задания игнорируется
Я пытаюсь указать время, в которое должна быть запущена периодическая задача, созданная с помощью приложения django-celery-beat, таким образом:
# Incomplete project structure
├── config
│ ├── asgi.py
│ ├── celery.py
│ ├── settings.py
│ ├── urls.py
│ └── wsgi.py
├── manage.py
├── order_monitoring
│ ├── admin.py
│ ├── apps.py
│ ├── __init__.py
│ ├── models.py
│ ├── tasks.py
│ ├── tests.py
│ ├── urls.py
│ ├── utils
│ │ ├── scraperr
│ │ │ ├── browser.py
│ │ │ ├── chromedriver
│ │ │ ├── db_scraper
│ │ │ └── scraper.py
│ │ └── utils.py
│ └── views.py
# config/settings.py
...
USE_TZ = True
TIME_ZONE = 'Europe/London'
REDIS_HOST = '127.0.0.1'
REDIS_PORT = '6379'
CELERY_BROKER_URL = 'redis://' + REDIS_HOST + ':' + REDIS_PORT + '/0'
CELERY_BROKER_TRANSPORT_OPTIONS = {'visibility_timeout': 3600}
CELERY_RESULT_BACKEND = 'redis://' + REDIS_HOST + ':' + REDIS_PORT + '/0'
CELERY_ACCEPT_CONTENT = ['application/json']
CELERY_TASK_SERIALIZER = 'json'
CELERY_RESULT_SERIALIZER = 'json'
CELERY_IGNORE_RESULT = False
CELERY_BEAT_SCHEDULER = 'django_celery_beat.schedulers:DatabaseScheduler'
CELERY_ENABLE_UTC = False
CELERY_TIMEZONE = TIME_ZONE
# config/celery.py
import os
from celery import Celery
from celery.schedules import crontab
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'config.settings')
app = Celery('config',)
app.config_from_object('django.conf:settings', namespace='CELERY')
app.autodiscover_tasks()
# order_monitoring/utils/utils.py
...
timezone = pytz.timezone('Europe/London')
schedule, _ = CrontabSchedule.objects.get_or_create(
minute='1',
hour='*',
day_of_week='*',
day_of_month='*',
month_of_year='*',
timezone=timezone,
)
localtime = datetime.datetime.now(pytz.timezone('Europe/London')) + datetime.timedelta(seconds=5)
try:
task = PeriodicTask.objects.get(name='Monitor orders')
task.crontab = schedule
task.args = arguments
task.start_time=localtime # Here I set the time at which the task should start
except ObjectDoesNotExist as exception:
task = PeriodicTask.objects.create(
crontab=schedule,
name='Monitor orders',
task='monitor_orders',
args=arguments,
start_time=localtime, # Here I set the time at which the task should start
)
if action == 'start':
task.enabled = True
task.save()
elif action == 'finish':
task.enabled = False
task.save()
PeriodicTask.objects.update(last_run_at=None)
PeriodicTasks.changed(task)
print('task date', task.start_time) # It shows here that the date I need is set
Но в результате она не выполняется в указанное время через start_time
. После невероятно огромного количества времени, проведенного в раздражении, я заметил, что если посмотреть на задачу через django shell
, то значение параметра start_time будет иметь значение datetime.datetime(2022, 7, 30, 14, 29, 37, 727701, tzinfo=datetime.timezone.utc)
. Вопрос в том, как изменить время начала периодической задачи
Возможно, вы изменили настройки часового пояса Django.
$ python manage.py shell
>>> from django_celery_beat.models import PeriodicTask
>>> PeriodicTask.objects.update(last_run_at=None)