Периодические задачи на django и celery step by step (без django-celery-beat)
Без лишних слов -> сразу инструкция: (сразу укажу -> работаем только через linux, на windows ошибки с redis будут).
Информация взята из этого видео а в статье я обращу внимание на детали из за которых страдал 2 дня ( все полные пояснения к коду в видео (что для чего зачем и почему)).
Приготовления
Создаем папку и внутри инициализируем проект ( я через poetry )
poetry init
Устанавливаем все что нужно ->
poatry add django redis celery
Создаем django проект и переходим в него
django-admin startproject <name_of_project> cd <name_of_project>
Создаем приложение
django-admin startapp <name_of_app>
Добавляем приложение в INSTALLED_APPS
INSTALLED_APPS = [
"django.contrib.admin",
"django.contrib.auth",
"django.contrib.contenttypes",
"django.contrib.sessions",
"django.contrib.messages",
"django.contrib.staticfiles",
"<name_of_app>",
]
Настройка celery и redis
Добавляем в settings.py
REDIS_HOST = "0.0.0.0"
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"
В файле init.py в папке нашего проекта (там где лежит settings.py)
from .celery import app as celery_app
__all__ = ("celery_app",)
Далее в этой же папке (там где лежит settings.py) создаем файлик с именем celery.py и запишем в него
import os
from celery import Celery
from celery.schedules import crontab
os.environ.setdefault("DJANGO_SETTINGS_MODULE", '<name_of_project>.settings')
app = Celery('<name_of_project>')
app.config_from_object('django.conf:settings', namespace="CELERY")
app.autodiscover_tasks()
# заносим таски в очередь
app.conf.beat_schedule = {
'every': {
'task': '<name_of_app>.tasks.repeat_order_make',
'schedule': crontab(),# по умолчанию выполняет каждую минуту, очень гибко
}, # настраивается
}
Теперь в папке нашего приложения создаем tasks.py и код там
если потом захотите протестировать как будет работать с ORM то создайте в моделях Person и примените миграции ( Person с полями last_name, first_name соответственно)
from <name_of_project>.celery import app
#from .models import Person
#import requests
#import json
#import time
@app.task #регистриуем таску
def repeat_order_make():
print('adsdasd')
#url = 'sdasd'
#obj = Person.objects.get_or_create(last_name=f'{time.time()}11111111111111111', first_name='1111')
return "необязательная заглушка"
Последние действия
теперь нам осталось совсем немного
сделать миграции
python manage.py migrate
запустить redis либо через докер
docker run -d -p 6379:6379 redis
либо тут смотрим установказапустить сервер python manage.py runserver
Обязательно запустить worker ->
celery -A <name_of_project> worker -l info
запустить beat (в другой окне терминала) ->
celery -A <name_of_project> beat -l info



Заключение
Вот так можно реализовать периодические таски с django, можно работать с Orm, например дальше я создаю запись в бд каждую минуту

Cпасибо за просмотр.