Django автоматические джобы
Хочу реализовать такой функционал в django , что бы после деплоя на сервере работали автоматические джобы, которые будут выполнять определённый функционал (например каждый час создавать csv файл с рандомной строкой)
Пытался сделать двумя способами через celery и через django-crontab Оба варианта не работают.
Вариант Celery
Файл proj/celery.py (proj название корневой папки, где расположен settings.py)
import os
from celery import Celery
from celery.schedules import crontab
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'proj.settings')
app = Celery('apps.csv_maker') # папка с приложением django , которо будет создавать csv
app.config_from_object('django.conf:settings')
# Load task modules from all registered Django app configs.
app.autodiscover_tasks()
app.conf.beat_schedule = {
'send-report-every-single-minute': {
'task': 'apps.csv_maker.create_random_csv',
'schedule': crontab(), # change to `crontab(minute=0, hour=0)` if you want it to run daily at midnight
},
}
Файл tasks.py (в приложении apps.csv_maker)
from proj.celery import app
@app.task
def create_random_csv():
# some logic ....
print('making data for csv')
return True
Файл settings.py
REDIS_HOST = 'localhost'
REDIS_PORT = '6379'
BROKER_URL = 'redis://' + REDIS_HOST + ':' + REDIS_PORT + '/0'
BROKER_TRANSPORT_OPTIONS = {'visibility_timeout': 3600}
CELERY_RESULT_BACKEND = 'redis://' + REDIS_HOST + ':' + REDIS_PORT + '/0'
При запуске manage.py runserver, джоб не отрабатывает.
При запуске celery -A proj beat
LocalTime -> 2021-05-12 10:06:04
Configuration ->
. broker -> redis://localhost:6379/0
. loader -> celery.loaders.app.AppLoader
. scheduler -> celery.beat.PersistentScheduler
. db -> celerybeat-schedule
. logfile -> [stderr]@%WARNING
. maxinterval -> 5.00 minutes (300s)
[2021-05-12 10:06:07,008: ERROR/MainProcess] beat: Connection error: Error 10061 connecting to localhost:6379. No connection could be made because the target machine actively refused it.. Trying again in 2.0 seconds...
Вариант с django-crontab так же не работает, пытался реализовать вот так
Ответы (1 шт):
celery для работы требует хранилище.
Это может быть rabbitmq или redis (и еще есть варианты). Это значит нужно где-то иметь запущенный сервис хранилища, чтоб celery можно было использовать. Вы сконфигурировали celery использовать redis и указали localhost - вот celery пробует и не может присоединиться.
Так что нужно запустить redis.