Django Signals — গোপন জাদু নাকি বিপজ্জনক ফাঁদ?

pykothon
পাইকথন
Published on Sep, 30 2025 5 min read 0 comments
image

ভূমিকা

Django Signals হলো Django ফ্রেমওয়ার্কের একটি শক্তিশালী ফিচার যা "event-driven" প্রোগ্রামিং সহজ করে। এটি এমন একটি সিস্টেম যেখানে কোনো ইভেন্ট (event) ঘটলে স্বয়ংক্রিয়ভাবে নির্দিষ্ট কোড চালানো যায়।

একটি সুন্দর analogy হলো — Django Signals হলো একটি “ডোরবেল” 🔔। যখন কোনো মডেলে পরিবর্তন হয়, তখন এই ডোরবেল বাজে, আর সেই ডোরবেলের আওয়াজ শুনে নির্দিষ্ট কাজ সম্পন্ন হয়।

কিন্তু শক্তিশালী হওয়ায় Signals ব্যবহার করলে কিছু “গোপন ঝুঁকি” তৈরি হতে পারে। এই আর্টিকেলে আমরা Django Signals কী, কীভাবে কাজ করে, এবং এর সঠিক ব্যবহার সম্পর্কে বিস্তারিত আলোচনা করব।

Django Signals কী?

Signals হলো Django-তে একটি “observer pattern” এর বাস্তবায়ন। এটি একটি ইভেন্ট-হ্যান্ডলার সিস্টেম যেখানে কোনো মডেল পরিবর্তন হলে নির্দিষ্ট ফাংশন চালানো হয়।

Django Signals-এর কিছু সাধারণ ধরন:

  • pre_save — মডেল save হওয়ার আগে ট্রিগার হয়।
  • post_save — মডেল save হওয়ার পরে ট্রিগার হয়।
  • pre_delete — মডেল delete হওয়ার আগে ট্রিগার হয়।
  • post_delete — মডেল delete হওয়ার পরে ট্রিগার হয়।

উদাহরণ:

from django.db.models.signals import post_save
from django.dispatch import receiver
from myapp.models import Product

@receiver(post_save, sender=Product)
def product_created(sender, instance, created, **kwargs):
    if created:
        print(f"Product created: {instance.name}")

এখানে product_created ফাংশনটি Product মডেলের post_save সিগন্যাল শুনে কাজ করে।

Explicit vs Implicit Code

স্পষ্ট কোড (Explicit Code)

স্পষ্ট কোডে ডেভেলপাররা জানে ঠিক কোন কাজ হচ্ছে এবং কোথায় হচ্ছে।

def create_product_with_audit(name, price):
    product = Product.objects.create(name=name, price=price)
    AuditLog.objects.create(
        message=f"Product '{product.name}' was created via service."
    )
    print("SERVICE CALLED: Explicitly logged product creation.")
    return product

এখানে কাজের ধাপ পরিষ্কার: পণ্য তৈরি → লগ তৈরি।

ইমপ্লিসিট কোড (Implicit Code)

Signals ব্যবহার করলে .save() বা .create() কলেই অনেক কিছু ট্রিগার হতে পারে — যা কোড পড়ার সময় দেখা যায় না।

product = Product.objects.create(name="Laptop", price=1500)

যেখানে শুধু একটি লাইন কোড আছে, কিন্তু Signals-এর কারণে অনেক গোপন কাজ চলতে পারে — যেমন লগ তৈরি, ইমেইল পাঠানো, ক্যাশে অবৈধকরণ ইত্যাদি।

এই ধরনের “গোপন কাজ” ডিবাগিং এবং রক্ষণাবেক্ষণ কঠিন করে তোলে।

Signals ব্যবহারের ঝুঁকি

১. গোপন খরচ (Hidden Cost):
যদি Signals-এ ভারী কাজ থাকে (যেমন ডাটাবেস কোয়েরি বা API কল), তবে .save() অনেক ধীর হয়ে যেতে পারে।

২. ডিবাগিং সমস্যা:
ডেভেলপাররা সবসময় জানে না যে Signals কোথায় ফায়ার হচ্ছে, ফলে বাগ খুঁজে পাওয়া কঠিন হয়ে যায়।

৩. “Spooky Action at a Distance”:
একটি সাধারণ .save() কলও সিস্টেম জুড়ে চেইন প্রতিক্রিয়া তৈরি করতে পারে — যা ভবিষ্যতে বোঝা কঠিন হয়।

Signals ব্যবহার করার সেরা অভ্যাস

  • স্পষ্ট সার্ভিস ফাংশন ব্যবহার করুন:
    গুরুত্বপূর্ণ ব্যবসায়িক লজিকের জন্য সার্ভিস ফাংশন বানানো সবচেয়ে ভালো।
  • Signals হালকা কাজের জন্য ব্যবহার করুন:
    যেমন লগিং, অ্যানালিটিক্স, ক্যাশে অবৈধকরণ, মেট্রিক্স আপডেট ইত্যাদি।
  • ভারী কাজ ব্যাকগ্রাউন্ডে রাখুন:
    Celery বা অন্য background job queue ব্যবহার করুন।
  • Signals ডকুমেন্ট করুন:
    আপনার সিস্টেমে Signals কীভাবে কাজ করছে তা স্পষ্টভাবে ডকুমেন্ট করুন।

বাস্তব উদাহরণ

ধরা যাক একটি ই-কমার্স ওয়েবসাইট আছে।

  • post_save Signal ব্যবহার করে প্রতিটি নতুন পণ্য তৈরি হলে লগ তৈরি করা যেতে পারে।
  • কিন্তু যদি সেই Signal এ ডাটা প্রসেসিং বা API কল থাকে, তাহলে প্রতিটি পণ্য তৈরি ধীর হয়ে যাবে।
  • সেক্ষেত্রে সবচেয়ে ভালো হবে: Signal কেবল “লগ তৈরির নোটিশ” পাঠাবে, আর ভারী কাজ Celery ব্যাকগ্রাউন্ড টাস্কে নেবে।

উপসংহার

Django Signals হলো একটি শক্তিশালী টুল। কিন্তু এটি যেন “গোপন জাদু” হয়ে না দাঁড়ায়, তাই সতর্কভাবে ব্যবহার করতে হবে।

স্পষ্ট কোডই ভালো, গোপনীয় নয়।
Django Signals ব্যবহার করুন ছোট, হালকা কাজের জন্য — এবং ব্যবসায়িক লজিকের জন্য স্পষ্ট সার্ভিস ফাংশন ব্যবহার করুন।

Django Signals-এর এই “hidden magic” সঠিকভাবে ব্যবহার করলে আপনার প্রজেক্ট আরও modular, maintainable, এবং scalable হবে।

0 Comments