Django’da Asenkron Programlama

Django’da Asenkron Programlama

Yazılımcılar için kahve adeta yakıttır. Gelin konumuza da kahveyle başlayalım.

Bir kahve makinesi düşünün:

  • Senkron dünyada kahvenizi koyarsınız ve makine kahveyi hazırlayana kadar başında beklersiniz. Bu sırada başka hiçbir şey yapamazsınız.

  • Asenkron dünyada ise kahveyi koyar, bilgisayarınızı açar, e-postalarınızı kontrol eder ya da kod yazmaya başlarsınız. Kahve hazır olduğunda makine size haber verir.

İşte asenkron programlama tam olarak böyle çalışır. Bir işin tamamlanmasını beklerken sistem diğer işlerle ilgilenmeye devam edebilir.

Web uygulamalarında da bu fark çok önemlidir. Çünkü modern dünyada kullanıcılar anlık bildirimler, canlı sohbetler, gerçek zamanlı veri akışları bekliyor. Bu noktada asenkron programlama, klasik senkron yapıların sınırlarını aşarak uygulamalarımıza hız ve esneklik kazandırıyor.

React’te Async/Await Deneyimi

Asenkron programlamayı en sık hissettiğimiz yerlerden biri frontend tarafıdır. Mesela bizim projelerimizde React kullanırken API’den veri çekmek için async/await yapısını sık sık görüyoruz:

	useEffect(() => {
        const fetchData = async () => {
            let apiEndpoint = 'https://............/api/apiexample/';
          
            const response = await fetchData({
                api: apiEndpoint,
                toast,
                dateFields: ["created_at", "updated_at"],
            });
            setData(response);
        };

        fetchData();
    }, [Id]);

Bu kod parçasında await fetchData(...) ifadesi API’den veri gelene kadar uygulamanın donmamasını sağlar. Kullanıcı başka butonlara basabilir, sayfada gezinebilir. Cevap geldiğinde setCaseFilesData çalışır ve ekran güncellenir.

Burada dikkat edilmesi gereken nokta şudur: React’te kullandığımız async/await, Django’dan tamamen bağımsızdır. Yani backend Django da olsa başka bir framework de olsa frontend tarafındaki asenkron mekanizma aynı şekilde çalışır.

Django’nun Klasik Yapısı ve Asenkron Desteğe Geçiş

Django yıllar boyunca tamamen senkron çalışan bir framework olarak kullanıldı. Bir kullanıcı request gönderdiğinde Django onu işler, response döner ve ardından sıradaki request işlenirdi.

Bu yapı basit CRUD işlemleri için yeterliydi. Ancak bir view içerisinde:

  • Harici bir API çağrısı,

  • E-posta gönderme,

  • Dosya okuma gibi beklemeli işlemler olduğunda tüm sistem bu bekleme süresi boyunca bloklanıyordu.

ASGI ile Yeni Dönem

Django 3.1 sürümüyle birlikte ASGI (Asynchronous Server Gateway Interface) desteği geldi. ASGI klasik WSGI’nin asenkron versiyonudur.

Bu sayede Django artık async def ile yazılmış view’leri de çalıştırabiliyor.

Örnek:

from django.http import JsonResponse
import asyncio 

# Senkron view
def sync_view(request):
	import time
	time.sleep(2)  # Bu sırada tüm sistem bekler
	return JsonResponse({"message": "Senkron Django"})
	
# Asenkron view
async def async_view(request):
	await asyncio.sleep(2)  # Bu sırada diğer request’ler işlenebilir
	return JsonResponse({"message": "Asenkron Django"})

Fark:

  • sync_view sırasında başka kullanıcıların isteği bloklanır.

  • async_view sırasında Django diğer kullanıcıların isteklerini de işleyebilir.

Django’da Asenkron Kod Nasıl Kullanılır?

1. View’lerde async def Kullanmak

from django.http import JsonResponse
import asyncio

async def async_view(request):
await asyncio.sleep(1)
return JsonResponse({"status": "ok"})

2. Harici API Çağrıları İçin httpx

import httpx
from django.http import JsonResponse
async def get_weather(request):
    async with httpx.AsyncClient() as client:
        r = await client.get("https://api.weatherapi.com/v1/current.json?q=Istanbul")
    return JsonResponse(r.json())

3. ORM Kullanımı 


from asgiref.sync import sync_to_async
from django.contrib.auth.models import User
from django.http import JsonResponse
async def get_user_count(request):
    count = await sync_to_async(User.objects.count)()
    return JsonResponse({"user_count": count})

4. Gerçek Zamanlı Senaryolar → Channels


from channels.generic.websocket import AsyncWebsocketConsumer
import json
class ChatConsumer(AsyncWebsocketConsumer):
    async def connect(self):
        await self.accept()
        await self.send(text_data=json.dumps({"msg": "Merhaba!"}))

Django’da Asenkron Programlama Ne Zaman Kullanılmalı?

Doğru Senaryolar

  • Harici API çağrıları

  • E-posta gönderme

  • WebSockets (canlı sohbet, bildirim sistemi)

  • Gerçek zamanlı akışlar (dashboard, skor tabloları)

Gereksiz Senaryolar

  • CPU yoğun işlemler (büyük hesaplamalar → Celery daha uygun)

  • Basit CRUD işlemleri

  • ORM sorguları (henüz tam async değil, sync_to_async ile kullanılmalı)

Asenkron Programlamanın Zorlukları

  • Django ORM hâlâ tamamen asenkron değil.

  • Üçüncü parti kütüphaneler async desteği sunmayabilir.

  • Debugging ve test süreçleri sync koda göre biraz daha zor olabilir.

Sonuç

Django senkron yapısıyla uzun yıllar güvenilir projelere ev sahipliği yaptı. Ancak günümüzün ihtiyaçları artık gerçek zamanlı etkileşim ve yüksek eşzamanlılık üzerine kurulu.

  • ASGI desteği sayesinde Django artık hem sync hem async çalışabiliyor.

  • Channels ile WebSocket ve canlı iletişim mümkün hale geldi.

  • Gelecekte ORM’in tamamen async olmasıyla birlikte Django çok daha performanslı olacak.

Kısacası doğru yerde kullanıldığında async Django projelerine büyük esneklik ve hız kazandırıyor.

Kaynakça

Gökçe Güler
Gökçe Güler9 Eylül 2025 06:17

Benzer Yazılar