Django ve Celery Nedir?
Django, güçlü bir web geliştirme framework’üdür ve Python dilinde yazılmıştır. Veritabanı yönetimi, kullanıcı kimlik doğrulama, form işleme ve birçok başka fonksiyonu otomatikleştirerek geliştiricilerin zamandan tasarruf etmelerini sağlar. Özellikle hızlı bir şekilde sağlam web uygulamaları geliştirmek için idealdir. Ancak, Django uygulamaları bazı durumlarda zaman alıcı ve uzun süreçlere sahip görevler gerektirebilir. Bu gibi durumlarda Celery devreye girer.
Celery, dağıtık görev kuyruğu sistemi olarak görev yapan bir Python kütüphanesidir. Asenkron görevleri yönetmek için geliştirilen Celery, projelerin arka planda çalışabilen zaman alıcı işlemler gerçekleştirmesine olanak tanır. Django ile entegrasyonu sayesinde, uygulamalarımızda yapmamız gereken işleri arka planda işleterek kullanıcı deneyimini büyük ölçüde iyileştirebiliriz.
Django ve Celery’yi bir arada kullanmak, uygulamanızın performansını artırır ve kullanıcı etkileşimlerini daha akıcı hale getirir. Örneğin, bir kullanıcının bir dosya yüklemesi gerektiğinde, bu dosyanın yüklenmesi ve işlenmesi uzun sürebilir. Bu süreci asenkron hale getirerek kullanıcıya hemen geri dönüş yapma fırsatını yakalarız.
Celery Kurulumu ve Django Entegrasyonu
Celery’i Django projemizde kullanmaya başlamak için öncelikle gerekli kütüphaneleri yüklememiz gerekiyor. Bunun için pip kullanarak Celery ve bir mesaj arka planı (örn. Redis veya RabbitMQ) yükleyebilirsiniz. Aşağıdaki komutları terminalde çalıştırarak gerekli kütüphaneleri yükleyin:
pip install celery redis
Daha sonra Django projemizde Celery’i kurmalıyız. Bunun için, projenizin ana dizininde bir dosya oluşturun ve ona celery.py
adını verin. Bu dosya, Celery uygulamanızın yapılandırmalarını içerecektir. Aşağıdaki örnekte celery.py
dosyası nasıl yapılandırılacağını görebilirsiniz:
from __future__ import absolute_import, unicode_literals
import os
from celery import Celery
# Django ayarlarının modülünü belirtin.
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'myproject.settings')
app = Celery('myproject')
# Celery yapılandırmalarını Django projesinde yeralan ayar dosyasıyla yükleyin.
app.config_from_object('django.conf:settings', namespace='CELERY')
# Tüm Django uygulamalarındaki görevleri otomatik olarak yükleyin.
app.autodiscover_tasks()
Bu basit yapılandırma ile Celery’i projeye dahil etmiş olduk. ‘myproject’ kısmını kendi projenizin adıyla değiştirin. Celery’in mesaj arka planı ile bağlantı kurması için settings.py
dosyanıza gerekli ayarları eklemeyi unutmayın:
CELERY_BROKER_URL = 'redis://localhost:6379/0'
Asenkron Görev Oluşturma
Celery ile çalışmaya başlamak için bir görev tanımlamamız gerekiyor. Görevler, Celery ile tanımlanan işlevlerdir ve bu işlevlerin nasıl çalışacağını belirler. Örneğin, basit bir toplama işlemi gerçekleştiren bir görev tanımlayalım:
@app.task
def add(x, y):
return x + y
Yukarıdaki durumda, add
adında bir görev oluşturduk. Bu görev, verilen iki sayıyı alır ve toplama işlemi gerçekleştirir. Artık bu görevi asenkron olarak çalıştırabiliriz:
result = add.delay(4, 6)
Burada delay
metodu, görevi asenkron şekilde çalıştırır ve hemen geri döner. Görevin sonucunu daha sonra şu şekilde kontrol edebilirsiniz:
result.ready() # Görev tamamlandı mı?
result.result # Görev sonucu
Celery ve Django ile İleri Seviye Uygulamalar
Celery ile Django’yu entegrasyonunu sağladıktan sonra, daha karmaşık görevleri yönetme yeteneğine sahip olursunuz. Örneğin, bir kullanıcı kaydından sonra e-posta gönderme işlemi, yüklenen bir dosyanın işlenmesi veya belirli aralıklarla veri günlükleri oluşturma gibi görevleri Celery ile rahatlıkla yönetebilirsiniz. Aşağıda, bir e-posta gönderme görevinin nasıl tanımlanacağına dair bir örnek bulunmaktadır:
@app.task
def send_email_task(email_address):
send_mail(
'Hoşgeldiniz!',
'Hesabınız başarıyla oluşturuldu.',
'[email protected]',
[email_address],
fail_silently=False,
)
Bu örnekte, kullanıcı kaydı tamamlandığında send_email_task
görevi çağrılabilir. Bu görev arka planda çalıştığı için kullanıcıya hemen geri dönüş yapılırken e-posta gönderimi gerçekleştirilir.
Bunun yanı sıra, Celery’in görevleri zamanlayabilen beat
işlevini kullanarak belirli döngülerde görevlerin otomatik çalışmasını sağlayabilirsiniz. Örneğin, her gün saat 12:00’de belirli bir raporu oluşturmak için aşağıdaki gibi bir yapılandırma oluşturabilirsiniz:
from celery.schedules import crontab
app.conf.beat_schedule = {
'generate-report-every-noon': {
'task': 'myapp.tasks.generate_report',
'schedule': crontab(minute=0, hour=12), # Her gün saat 12:00'de çalışır.
},
}
Hatalarla Baş Etme ve Görevlerin Yönetimi
Celery ile çalışırken, görevlerin durumunu ve olası hataları yönetmek de önemlidir. Görevlerinizde hata meydana geldiğinde bunu yakalamak ve uygun bir şekilde yanıt vermek için bazı yapılandırmalar yapmalısınız. Örneğin, bir görevi zaman sınırlı hale getirerek belirli bir süre içinde tamamlanmadığında hatalar alabilirsiniz:
@app.task(bind=True, soft_time_limit=30)
def long_task(self):
try:
# Uzun süren işlem burada
except SoftTimeLimitExceeded:
self.retry(countdown=60) # 60 saniye sonra tekrar dene
Benzer şekilde, Celery arayüzü kullanarak görevlerinizi takip edebilir ve istediğiniz zaman durdurabilirsiniz. Web tabanlı bir izleme aracı kullanarak görevlerinizi yönetebilirsiniz. Celery, Flower gibi izleme araçlarına sahiptir, bu sayede görevlerinizi görsel bir arayüzle takip edebilirsiniz.
Özet ve Sonuç
Django ile Celery kullanarak, web uygulamalarınızda arka plan görevlerini etkili bir şekilde yönetebilirsiniz. Kullanıcı deneyimini artıran asenkron görevler ile kullanıcıya hemen geri dönüş yapabilir, zaman alıcı işlemleri arka planda gerçekleştirebilirsiniz. Kurulumun ardından görev tanımlama, asenkron çalışma, hata yönetimi ve izleme gibi konularda bilgi sahibi oldunuz.
Artık bu bilgileri kullanarak kendi projelerinizi geliştirebilir ve etkin bir şekilde Django uygulamalarınızda Celery’i kullanabilirsiniz. Unutmayın ki, her yeni projenizle birlikte daha fazla deneme yaparak Celery ile olan deneyiminizi zenginleştirebilirsiniz. Denemeler yapmaktan çekinmeyin ve topluluğa katkıda bulunun!
Celery ile ilgili her türlü sorunuz için yorumlarda buluşmayı unutmayın!