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 шт):

Автор решения: Roman Konoval

celery для работы требует хранилище.

Это может быть rabbitmq или redis (и еще есть варианты). Это значит нужно где-то иметь запущенный сервис хранилища, чтоб celery можно было использовать. Вы сконфигурировали celery использовать redis и указали localhost - вот celery пробует и не может присоединиться.

Так что нужно запустить redis.

→ Ссылка