Django ile zamanlanmış görev oluşturma (Django Celery Scheduled Tasks) işlemleri mail gönderimi gibi belirli görevlerin periyodik olarak tekrarlanması için kullanılır.
Örneğin bir mail listeniz var ve belirli zamanlarda haber bülteni veya sisteminizin gelişimi ile alakalı yazdığınız yazılar var. Bu yazıları belirlenen zamanlarda müşterilerinize göndermek istiyorsunuz. İşte bu gibi durumlarda karşınıza "Zamanlanmış Görevler" çıkmaktadır.
Django ile zamanlanmış görev oluşturmak için Celery kütüphanesini kullanımı şu şekildedir. Biz server olarak Ubuntu 21.04 LTS kullanmaktayız. Kurulumlar Ubuntu 21.04, Django 3.2.9 ve Python 3.8 için anlatılmıştır.
1- Ubuntu için Redis kurulumunu yapıyoruz.
sudo apt update
sudo apt install redis-server
sonra redis konfigürasyon dosyasını açıp supervised satırını
supervised systemd
olarak güncelliyoruz.
2- Django için celery kurulumunu yapıyoruz.
pip install celery[redis]
3- settings.py dosyasına aşağıdaki komutları ekliyoruz.
CELERY_TIMEZONE = TIME_ZONE
CELERY_TASK_TRACK_STARTED = True
CELERY_BACKEND = os.environ.get("CELERY_BROKER", 'redis://localhost:6379/3')
CELERY_BROKER_URL = os.environ.get("CELERY_BROKER", "redis://localhost:6379/0")
CELERY_RESULT_BACKEND = os.environ.get("CELERY_BROKER", "redis://localhost:6379")
BROKER_URL = 'redis://localhost:6379/0'
CELERY_ACCEPT_CONTENT = ['application/json']
CELERY_TASK_SERIALIZER = 'json'
CELERY_RESULT_SERIALIZER = 'json'
4- settings.py nin bulunduğu klasördeki __init__.py dosyasına şu komutları ekliyoruz.
# This will make sure the app is always imported when
# Django starts so that shared_task will use this app.
from .celery import app as celery_app
__all__ = ('celery_app',)
5- app klasörünün içerisine tasks.py isminde dosya oluşturuyoruz ve içeriğine Scheduled Tasks için kullanılacak fonksiyonu yazıyoruz.
from __future__ import absolute_import
import datetime
from celery import shared_task
from django.utils import timezone
from datas.models import Data
from iotv6.debug import debug
from logs.models import Log
import logging
logger = logging.getLogger(__name__)
@shared_task
def zamanlanmis_gorev_1():
logger.info("zamanlanmis_gorev_1")
6- settings.py dosyamızın INSTALLED_APPS listesine django_celery_beat i ekliyoruz. ve migrate ediyoruz.
INSTALLED_APPS = [
'...'
'django_celery_beat',
]
7- Ubuntu için supervisor kurulumunu yapıyoruz.
sudo apt update && sudo apt install supervisor
8- /etc/supervisor/conf.d içerisine supervisor dosyalarımızı oluşturuyoruz. Burada 2 adet dosya oluşturacağız. Birincisi beat dosyası, ikincisi worker dosyası. Bu dosyaları server ımız başladığında otomatik olarak beat ve worker ın çalışması için yapılıyor.
iot_beat.conf içeriği:
[program:iotv6_beat]
command=/home/myproj/venvpy3/bin/celery -A iotv6.celery beat -l INFO --scheduler django_celery_beat.schedulers:DatabaseScheduler
directory=/home/myproj/iotv6
user=root
numprocs=1
stdout_logfile=/var/log/celery/iotv6_beat.log
stderr_logfile=/var/log/celery/iotv6_beat.log
autostart=true
autorestart=true
startsecs=10
stopwaitsecs = 600
killasgroup=true
priority=999
[program:iotv6_worker]
command=/home/myproj/venvpy3/bin/celery -A iotv6.celery worker -l INFO --scheduler django_celery_beat.schedulers:DatabaseScheduler
directory=/home/myproj/iotv6
user=root
numprocs=1
stdout_logfile=/var/log/celery/iotv6_worker.log
stderr_logfile=/var/log/celery/iotv6_worker.log
autostart=true
autorestart=true
startsecs=10
stopwaitsecs = 600
killasgroup=true
priority=999
9- Django uygulamamızı restart yapıyoruz. Biz uwsgi kullanıyoruz.
sudo systemctl restart uwsgi
10- supervisorctl i update ediyoruz.
sudo supervisorctl reread
sudo supervisorctl update
Bu işlemlerden sonra django celery Scheduled Tasks in sorunsuz olarak çalışması gerekiyor. Şimdi Django admin panele girerek task in zamanlamasını oluşturalım.
Hepsi bu kadar iyi çalışmalar.