Как стать автором
Обновить

Периодические задачи на django и celery step by step (без django-celery-beat)

Без лишних слов -> сразу инструкция: (сразу укажу -> работаем только через linux, на windows ошибки с redis будут).

Информация взята из этого видео а в статье я обращу внимание на детали из за которых страдал 2 дня ( все полные пояснения к коду в видео (что для чего зачем и почему)).

Приготовления

  1. Создаем папку и внутри инициализируем проект ( я через poetry ) poetry init

  2. Устанавливаем все что нужно -> poatry add django redis celery

  3. Создаем django проект и переходим в него django-admin startproject <name_of_project> cd <name_of_project>

  4. Создаем приложение django-admin startapp <name_of_app>

  5. Добавляем приложение в 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 "необязательная заглушка"

Последние действия

теперь нам осталось совсем немного

  1. сделать миграции python manage.py migrate

  2. запустить redis либо через докер docker run -d -p 6379:6379 redis либо тут смотрим установка

  3. запустить сервер python manage.py runserver

  4. Обязательно запустить worker -> celery -A <name_of_project> worker -l info

  5. запустить beat (в другой окне терминала) -> celery -A <name_of_project> beat -l info

после 4 команды
после 4 команды
после 5 команды мы отправили таску воркеру
после 5 команды мы отправили таску воркеру
как видим началось выполнение
как видим началось выполнение

Заключение

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

к first_name добавляю time.time() получая каждый раз новую запись
к first_name добавляю time.time() получая каждый раз новую запись

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

Теги:
Хабы:
Данная статья не подлежит комментированию, поскольку её автор ещё не является полноправным участником сообщества. Вы сможете связаться с автором только после того, как он получит приглашение от кого-либо из участников сообщества. До этого момента его username будет скрыт псевдонимом.