Django

⌘K
  1. Home
  2. Django
  3. Websoket+Celery Project C...
  4. পর্ব ৩: process_call এবং end_call — Redis + Celery দিয়ে Async Background Task

পর্ব ৩: process_call এবং end_call — Redis + Celery দিয়ে Async Background Task

🔧 Step 1: Celery ইনস্টল

pip install celery redis

🧠 Step 2: control_system/celery.py তৈরি করো

import os
from celery import Celery

os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'control_system.settings')

app = Celery('control_system')
app.config_from_object('django.conf:settings', namespace='CELERY')
app.autodiscover_tasks()

🧩 Step 3: control_system/__init__.py-তে অ্যাড করো

from .celery import app as celery_app

__all__ = ('celery_app',)

⚙️ Step 4: settings.py তে Redis Broker সেট করো

CELERY_BROKER_URL = 'redis://localhost:6379/0'
CELERY_ACCEPT_CONTENT = ['json']
CELERY_TASK_SERIALIZER = 'json'

🧠 Step 5: core/tasks.py – task define করো

from celery import shared_task
from .models import Operation
from django.utils import timezone
from datetime import datetime

@shared_task
def process_call_task(data):
    Operation.objects.create(
        dest_phone_number=data['dest_phone_number'],
        audio_player_number=data['audio_player_number'],
        source_id=data.get('source_id', 'unknown'),
        received_time=datetime.fromisoformat(data['received_time']),
        enqueue_time=timezone.now(),
        sip_id=data.get('sip_id')
    )
    return "Call Processed"

@shared_task
def end_call_task(device_id, command="end"):
    # এখানে future WebSocket integration হতে পারে
    print(f"Ending call on {device_id} with command {command}")
    return "Call Ended"

📡 Step 6: views.py – API call → Celery Task

from .tasks import process_call_task, end_call_task
from rest_framework.views import APIView
from rest_framework.response import Response
from rest_framework import status

# ✅ POST /process/
class ProcessCallView(APIView):
    def post(self, request):
        process_call_task.delay(request.data)
        return Response({"message": "Call request sent to queue"}, status=202)

# ✅ POST /endCall/
class EndCallView(APIView):
    def post(self, request):
        device_id = request.data.get("device_id")
        command = request.data.get("command", "end")
        end_call_task.delay(device_id, command)
        return Response({"message": f"Call end command sent to {device_id}"}, status=202)

🔗 Step 7: urls.py

from .views import ProcessCallView, EndCallView

urlpatterns += [
    path('process/', ProcessCallView.as_view()),
    path('endCall/', EndCallView.as_view()),
]

🚀 Step 8: Redis এবং Celery চালাও

✅ Redis চালাও (cmd/terminal)

redis-server

✅ Celery worker চালাও:

celery -A control_system worker --loglevel=info

📫 Test with Postman

🔹 /api/process/ (POST)

{
  "dest_phone_number": "01711112233",
  "audio_player_number": "01999998888",
  "received_time": "2025-04-04T12:00:00",
  "sip_id": "sip001",
  "source_id": "android001"
}

🔹 /api/endCall/ (POST)

{
  "device_id": "android001",
  "command": "end"
}

সারসংক্ষেপ

বিষয়
Redis Broker
Celery Task✅ process_call, end_call
Async Queue✅ delay()
Integration with DB✅ Operation create

How can we help?