Everion Consulting
Everion Consulting
Ana SayfaBlogDjango Signals Nedir? Temel Kullanım Rehberi

Django Signals Nedir? Temel Kullanım Rehberi

Django Signals Nedir? Temel Kullanım Rehberi
Gökçe Güler

Gökçe Güler

8 Ağustos 2025

Veritabanı YönetimiDjango

Bir kapı zilini düşünün: Zile bastığınızda ev sahibi kapının çalındığını bilir. Zil ev sahibine gidip “Biri kapıda” diye söylemez; sadece bir sinyal gönderir. Ev sahibi bu sinyali duyduğunda kapıyı açabilir, güvenlik kamerasına bakabilir ya da hiçbir şey yapmamayı tercih edebilir.

Django Signals da tam olarak böyle çalışır. Uygulamanızda belirli bir olay gerçekleştiğinde örneğin yeni bir kullanıcı kaydı oluşturulduğunda bu olaya “tepki vermek” isteyen başka bileşenler sinyal alır ve kendi görevini yerine getirir. Bu sayede modüller birbirine sıkı sıkıya bağımlı olmak zorunda kalmaz.

Signals loose coupling (gevşek bağlılık) ilkesinin güzel bir örneğidir. Kodunuzu modüler ve yeniden kullanılabilir kılar; farklı parçaların birbirinden habersiz şekilde iletişim kurmasını sağlar. Üstelik bu iletişim tek yönlüdür. Olayı tetikleyen taraf kimin tepki vereceğini bilmek zorunda değildir.

Django Signals Nedir?

Django Signals uygulamanızın farklı bölümleri arasında iletişim kurmanın esnek ve temiz bir yoludur. Bir olay meydana geldiğinde örneğin bir kayıt oluşturulduğunda güncellendiğinde ya da silindiğinde başka bir fonksiyon bu olaya otomatik olarak tepki verebilir. Bu yapı uygulamanızın parçalarını sıkı sıkıya bağlamadan yani “loosely coupled” şekilde birbiriyle konuşturmanıza olanak tanır. Böylece bir işlemin sonucunda tetiklenmesi gereken başka bir işlemi doğrudan çağırmak zorunda kalmadan sistem içinde "haberleşme" sağlanır.

Signals Ne İşe Yarar?

Django Signals kodunuzu daha modüler ve sürdürülebilir hale getirir. Örneğin:

  • Yeni bir kullanıcı kaydedildiğinde otomatik olarak bir profil oluşturabilirsiniz.
  • Bir nesne silindiğinde ilişkili diğer verileri temizleyebilirsiniz.
  • Bir sipariş onaylandığında anında bir e-posta gönderebilir ya da stoktan düşebilirsiniz.

Bu işlemlerin tamamı mevcut model yapısına doğrudan kod eklemeden yalnızca ilgili olay gerçekleştiğinde devreye giren mekanizmalar aracılığıyla yürütülebilir.

Sinyallerin Temel Oyuncuları

Django Signals sisteminde üç temel unsur vardır:

  • Gönderici (Sender): Olayı başlatan kaynak genellikle bir modeldir.
  • Alıcı (Receiver): Olay gerçekleştiğinde devreye giren işlev (fonksiyon).
  • Signal: Göndericiyle alıcı arasında köprü görevi gören yapı.

Ne Zaman Kullanılır?

Signals uygulamanızda şu gibi durumlarda oldukça kullanışlıdır:

  • Kayıt işlemlerinden sonra otomatik log tutulması
  • Yeni kullanıcı için varsayılan ayarların oluşturulması
  • İlişkili verilerin senkronize edilmesi
  • Belirli işlemler sonrası bildirim gönderilmesi

Django’nun Hazır (Built-in) Signals’ları

Django bazı yaygın olaylar için yerleşik sinyaller sunar. En çok kullanılanlar:

  • pre_save: Model veritabanına kaydedilmeden hemen önce tetiklenir.
  • post_save: Model kaydedildikten hemen sonra devreye girer.
  • pre_delete: Silme işleminden önce çağrılır.
  • post_delete: Silme işleminden sonra çalışır.
  • m2m_changed: Many-to-Many ilişkilerde ekleme veya çıkarma yapıldığında tetiklenir.

Bu sinyaller sayesinde model davranışlarını uygulamanızın farklı yerlerinde genişletebilir ve kontrol edebilirsiniz. Üstelik modelin içine yeni kodlar eklemek zorunda kalmadan.

Signals Nasıl Çalışır?

Django Signals’ın temel mantığı bir olay gerçekleştiğinde bunu “duyan” bir fonksiyonun harekete geçmesidir. Buradaki yapı sinyali gönderen ve sinyali yakalayan olmak üzere iki ana parçadan oluşur.

Temel Yapı:

Bir signal çalışırken şu akış izlenir:

  1. Olay gerçekleşir: Örneğin bir model save() edilir)
  2. Signal tetiklenir. post_save, pre_delete gibi)
  3. Bu sinyali dinleyen fonksiyonlar devreye girer.
  4. İlgili işlem yapılır. (log, e-posta, güncelleme vb.)

İki temel yol vardır;

1. @receiver Dekoratörüyle

En yaygın kullanılan yöntemdir. django.dispatch.receiver dekoratörü ile yazılır.

from django.db.models.signals import post_save
from django.dispatch import receiver
from .models import Order
@receiver(post_save, sender=Order)
def notify_new_order(sender, instance, created, **kwargs):
   if created:
       print(f"Yeni sipariş oluşturuldu: {instance.id }")

2. signal.connect() ile manuel bağlantı

Daha dinamik ve kontrol edilebilir bir yaklaşımdır:

from django.db.models.signals import post_save
def notify_user(sender, instance, created, **kwargs):
   if created
:        print(f"Yeni kullanıcı: {instance.username}")
post_save.connect(notify_user, sender=User)

Parametreler Ne Anlama Gelir?

Signal fonksiyonlarında kullanılan parametreler şunlardır:

ParametreAçıklama
senderOlayı başlatan model sınıfı (örneğin User)
instanceSignal'in çalıştığı model nesnesinin örneği
createdSadece post_save içinde kullanılır. True ise yeni bir kayıt oluşturulmuştur. False ise güncelleme yapılmıştır.
**kwargsDjango tarafından iletilen ekstra bilgiler (her zaman eklenmeli)

Bu yazıda Django Signals’ın ne olduğunu, nasıl çalıştığını ve temel kullanım şekillerini gördük. Signals doğru kullanıldığında uygulama içindeki işleyişi daha modüler ve yönetilebilir hale getirir. İleri seviye kullanım senaryoları, custom signal tanımlama, performans yönetimi ve testlerde signal kontrolü gibi konular ise sonraki yazılarda ele alınacak. Böylece karmaşık uygulamalarda olay bazlı düşünmenin gücünden en verimli şekilde yararlanabilirsiniz.

Django Signals Nedir? Temel Kullanım Rehberi | Everion Consulting