1. Veritabanı Sorgularını Optimize Etmek: N+1 Sorgusu ve Select Related
Veritabanı sorguları, bir API'nin performansını doğrudan etkileyen en önemli faktördür. Özellikle Django ORM (Object-Relational Mapping) kullanırken, dikkat edilmesi gereken en yaygın sorunlardan biri N+1 sorgusudur. Bu, özellikle ilişkili modelleri sorgularken her bir öğe için ayrı bir sorgu yapılması sonucunda ortaya çıkar ve performans sorunlarına yol açar.
```python
# İlişkili nesneleri sadece bir sorgu ile çekmek için select_related kullanıyoruz
queryset = Book.objects.select_related('author').all()
```
Bu basit optimizasyon, API'nizin hızını büyük ölçüde artırabilir.
2. Veri Seri Hale Getirmeyi İyileştirme
Django REST Framework, verileri serileştirirken bazen gereksiz verileri de işler, bu da API'nin yavaşlamasına neden olabilir. Veritabanından çektiğiniz verilerin yalnızca gerekli olanları serileştirilmelidir. Serializer sınıflarında sadece ihtiyacınız olan alanları belirtmek, gereksiz veri işleme yükünü ortadan kaldırır.
class BookSerializer(serializers.ModelSerializer):
class Meta:
model = Book
fields = ['id', 'title', 'author'] # Gereksiz alanları eklemeyin
```
Bu sayede API'niz sadece gerekli olan veriyi döndürecektir.
3. Sayfalama Kullanımı
Büyük veri kümeleriyle çalışırken, tüm veriyi tek bir istekte döndürmek, hem sunucu hem de istemci tarafında ciddi bir yük oluşturabilir. Django REST Framework, sayfalama desteğiyle API'nizin verilerini daha verimli hale getirir.
```python
from rest_framework.pagination import PageNumberPagination
class BookPagination(PageNumberPagination):
page_size = 10 # Her sayfada 10 öğe gösterilecek
class BookViewSet(viewsets.ModelViewSet):
queryset = Book.objects.all()
serializer_class = BookSerializer
pagination_class = BookPagination
```
Bu, özellikle büyük veri setlerine sahip projelerde önemli bir performans artışı sağlar.
4. Cache Kullanımı
API yanıtlarını önbelleğe almak, sıklıkla yapılan sorgularda büyük bir hız artışı sağlar. Django, cache özelliğiyle, veritabanı sorgularının sonuçlarını belirli bir süre için saklayabilir, böylece aynı veri için tekrar sorgu yapmanıza gerek kalmaz.
```python
from django.core.cache import cache
def get_books():
cached_books = cache.get('books_list')
if cached_books is None:
cached_books = Book.objects.all()
cache.set('books_list', cached_books, timeout=60*15) # 15 dakika süreyle cache'le
return cached_books
```
Bu şekilde, veritabanından yapılan her sorguda aynı veri tekrar sorgulanmaz, API'niz daha hızlı çalışır.
5. Veri Küçültme ve Sıkıştırma
API'den dönen verilerin boyutu, API yanıtlarının hızını etkileyebilir. Gereksiz verilerin, özellikle büyük verilerin istemciye gönderilmesi, ağ trafiğini artırır. JSON verisini sıkıştırarak, istemciye gönderilen veriyi azaltabilirsiniz.
```python
# settings.py dosyanızda gzip sıkıştırmayı etkinleştirebilirsiniz
MIDDLEWARE = [
'django.middleware.gzip.GZipMiddleware',
# diğer middleware'ler
]
```
Bu, veriyi sıkıştırarak iletmek, performans açısından oldukça etkili olabilir.
6. Asenkron API İstekleri
Daha büyük projelerde, asenkron işlemler gerçekleştirmek çok önemlidir. Django’nun 3.1 sürümünden itibaren asenkron destek sunulmaktadır. Bu, özellikle yoğun I/O işlemleri yapan API'lerde büyük bir fark yaratabilir. Django'nun asenkron özellikleriyle, örneğin veritabanı sorguları gibi I/O-bound işlemleri arka planda çalıştırarak, ana iş akışını hızlandırabilirsiniz.
# Asenkron bir view örneği
from django.http import JsonResponse
from asgiref.sync import sync_to_async
@sync_to_async
def get_books_async():
return Book.objects.all()
async def async_books_view(request):
books = await get_books_async()
return JsonResponse({'books': [book.title for book in books]})
```
Asenkron API'ler, uygulamanızın performansını daha da optimize eder ve kullanıcılara daha hızlı bir deneyim sunar.