Django Signal, apa dan bagaimana?

django

Django signal alias sinyal kalau saya kutip dari dokumentasi resmi django memiliki pengertian sebagai berikut:

In a nutshell, signals allow certain senders to notify a set of receivers that some action has taken place. They’re especially useful when many pieces of code may be interested in the same events.

Jadi apa maksudnya? dengan memanfaatkan Signal kita dapat memonitor suatu aksi telah terjadi di dalam program kita, sehingga kita bisa melakukkan aksi lain yang diperlukan.

Sebagaimana signal/sinyal radio, Django signal juga mempunya 2 buah bagian supaya bisa bermanfaat, yaitu Sender dan Receiver. Sender berfungsi untuk sebagai penghasil signal dan Receiver sebagai penerima signal. Hal-hal seru bisa kita lakukkan di bagian penerima ini, akan saya contohkan nanti di bawah.

Di Django terdapat beberapa jenis signal yang akan mungkin berguna buat anda. Disini saya hanya akan mencontohkan sebuah Built-in signal (sinyal yang sudah ada di Django) sehingga kita tidak perlu membuat signal sendiri (meskipun itu bisa).

Contoh signal bawaan django misalnya (https://docs.djangoproject.com/en/dev/ref/signals/):

  • pre_save, akan memberikan signal sesaat sebelum sebuah Model melakukkan operasi save (simpan) ke database.
  • post_save, akan memberikan signal sesaat sesudah sebuah Model melakukkan operasi save (simpan) ke database.
  • pre_delete, akan memberikan signal sesaat sebelum sebuah Model melakukkan operasi delete (hapus) record di database.
  • post_delete, akan memberikan signal sesaat sesudah sebuah Model melakukkan operasi delete (hapus) record di database. 

Ok bli, cukup lah berteori ria.. gimme some real codes…! he he.. sabar jack…

Ok ini dia implementasinya.

PROBLEM

Misal kita ingin web Django kita yang senilai 1 juta dollar 🙂 mampu mengirimkan email ke kita ketika seorang user memberikan komentar melalui website kita. Tentunya aplikasi komentar buatan kita sendiri jack..

SOLUSI

Kita akan memanfaatkan Django built-in signal yaitu post_save signal, yang artinya setelah sebuah komentar tersimpan ke database maka kita buat sebuat fungsi receiver (penerima signal) yang akan mengirimkan email ke kita lengkap dengan nama pengirim, dan isi komentarnya. Super sekali!!

CODES

Supaya sederhana kita langsung saja buat di file models.py di bawahnya  model Komentar.

Ini tidak disarankan, jangan membuat fungsi selain fungsi-fungsi berhubungan dengan Data di models.py. Ini hanya contoh untuk penyederhanaan, meskipun kode di bawah bisa jalan

#file: models.py

from django.db import models
#ini signal yang akan kita pakai
from django.db.models.signals import post_save

#buat model Komentar
class Komentar(models.Model):
    name = models.CharField(max_length=100)
    komen = models.TextField()

    def __unicode__(self):
        return self.name

# fungsi kirim_email kita memerlukan 2 buah parameter,
# nama dan komen.
def kirim_email(nama, komen):
   #.... kode disini ....

# Buat penerima signal nya,
# disini akan memanggil fungsi kirim email.
def ada_komentar_baru(sender, instance, created, **kwargs):
    if created:
        kirim_email(instance.name, instance.komen)

# Konek-kan sender dengan penerima signal
post_save.connect(ada_komentar_baru, sender=Komentar)

Yup, itu saja sangat sederhana sekali penggunaan nya, namun itu sudah cukup untuk memanfaatkan signal.

Yang paling perlu diperhatikan adalah pada pembuatan receiver ada_komentar_baru dan pemanggilan post_save.connect(…).

Catatan:

DI dalam fungsi ada_komentar_baru, terdapat parameter isntance dan created. Parameter instance inilah komentar yang telah disimpan di database, sehingga kita bisa panggil instance.name dan instance.komen karena instance = Komentar object.

Parameter created adalah sebuah nilai True / False, apabila ini adalah operasi simpan pertama kalinya maka created = True, sedangkan apabila ini operasi Update maka created = False. Itulah alasannya kenapa saya kirim email ketika created = True. Karena saya hanya ingin email terkirim ketika ada komentar baru saja.

Kenapa operasi Update database juga memanggil menghasilkan signal post_save? karena Update juga menyimpan (save) data di database. Is that simple..:)

Itu saja, sekarang setiap ada yang berkomentar maka kita akan menerima notifikasi nya lewat email. Jadi deh web 1 juta dollar kita, tinggal ajukan ke klien, dan tunggu deh bayaran nya lewat Paypal.. 😀

One thought on “Django Signal, apa dan bagaimana?

Leave a Reply

Your email address will not be published. Required fields are marked *