Django

⌘K
  1. Home
  2. Django
  3. Speed Optimization
  4. Django Bolt

Django Bolt

Django Bolt দিয়ে Django REST API দ্রুততর করার সম্পূর্ণ গাইড

📚 সূচিপত্র

  1. Django Bolt কি এবং কেন ব্যবহার করবেন
  2. প্রজেক্ট সেটআপ – স্টেপ বাই স্টেপ
  3. সাধারণ Django REST API তৈরি
  4. Django Bolt দিয়ে স্পিড বৃদ্ধি
  5. পারফরম্যান্স তুলনা
  6. Authentication ও Permission সহ

Django Bolt কি?

Django Bolt হলো একটি লাইব্রেরি যা Django REST Framework API কে 10-100 গুণ দ্রুত করে দেয়। এটি Rust দিয়ে তৈরি এবং Python এর সাথে কাজ করে।

কেন ব্যবহার করবেন?

  • অনেক দ্রুত: সাধারণ Django API এর চেয়ে 10-100x দ্রুত
  • 🔒 নিরাপদ: Django এর authentication ও permission সিস্টেম ঠিক থাকে
  • 🎯 সহজ: মাত্র কয়েক লাইন কোড পরিবর্তন করতে হয়
  • 📦 কম্প্যাটিবল: বিদ্যমান Django প্রজেক্টে সহজেই যুক্ত করা যায়

প্রজেক্ট সেটআপ

ধাপ ০: প্রয়োজনীয় সফটওয়্যার ইনস্টল

# Python 3.8+ ইনস্টল করুন (যদি না থাকে)
python3 --version

# Virtual environment তৈরি করুন
python3 -m venv venv
source venv/bin/activate  # Linux/Mac
# অথবা
venv\Scripts\activate  # Windows

ধাপ ১: Django প্রজেক্ট তৈরি

# প্রয়োজনীয় প্যাকেজ ইনস্টল
pip install django djangorestframework

# নতুন প্রজেক্ট তৈরি
django-admin startproject speedtest_project
cd speedtest_project

# নতুন অ্যাপ তৈরি
python manage.py startapp products

ধাপ ২: প্রজেক্ট কনফিগারেশন

speedtest_project/settings.py ফাইলে যোগ করুন:

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',

    # নতুন যোগ করুন
    'rest_framework',
    'products',
]

# REST Framework সেটিংস
REST_FRAMEWORK = {
    'DEFAULT_AUTHENTICATION_CLASSES': [
        'rest_framework.authentication.SessionAuthentication',
        'rest_framework.authentication.BasicAuthentication',
    ],
    'DEFAULT_PERMISSION_CLASSES': [
        'rest_framework.permissions.IsAuthenticated',
    ],
    'DEFAULT_PAGINATION_CLASS': 'rest_framework.pagination.PageNumberPagination',
    'PAGE_SIZE': 100
}

সাধারণ Django REST API

ধাপ ৩: Model তৈরি

products/models.py:

from django.db import models

class Product(models.Model):
    name = models.CharField(max_length=200)
    description = models.TextField()
    price = models.DecimalField(max_digits=10, decimal_places=2)
    stock = models.IntegerField(default=0)
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)
    is_active = models.BooleanField(default=True)

    class Meta:
        ordering = ['-created_at']
        indexes = [
            models.Index(fields=['name']),
            models.Index(fields=['price']),
        ]

    def __str__(self):
        return self.name

ধাপ ৪: Serializer তৈরি

products/serializers.py (নতুন ফাইল তৈরি করুন):

from rest_framework import serializers
from .models import Product

class ProductSerializer(serializers.ModelSerializer):
    class Meta:
        model = Product
        fields = ['id', 'name', 'description', 'price', 'stock', 
                  'created_at', 'updated_at', 'is_active']
        read_only_fields = ['created_at', 'updated_at']

ধাপ ৫: সাধারণ Django REST Views

products/views.py:

from rest_framework import viewsets
from rest_framework.permissions import IsAuthenticated
from rest_framework.decorators import action
from rest_framework.response import Response
from .models import Product
from .serializers import ProductSerializer

class ProductViewSet(viewsets.ModelViewSet):
    """
    সাধারণ Django REST Framework ViewSet
    এটি ধীর গতির কারণ প্রতিটি request এ Python এ সব কিছু প্রসেস হয়
    """
    queryset = Product.objects.all()
    serializer_class = ProductSerializer
    permission_classes = [IsAuthenticated]

    def get_queryset(self):
        queryset = Product.objects.all()

        # ফিল্টারিং
        is_active = self.request.query_params.get('is_active')
        if is_active is not None:
            queryset = queryset.filter(is_active=is_active.lower() == 'true')

        # মূল্য অনুযায়ী ফিল্টার
        min_price = self.request.query_params.get('min_price')
        if min_price:
            queryset = queryset.filter(price__gte=min_price)

        max_price = self.request.query_params.get('max_price')
        if max_price:
            queryset = queryset.filter(price__lte=max_price)

        return queryset

    @action(detail=False, methods=['get'])
    def active_products(self, request):
        """শুধুমাত্র সক্রিয় পণ্য দেখান"""
        products = self.queryset.filter(is_active=True)
        serializer = self.get_serializer(products, many=True)
        return Response(serializer.data)

ধাপ ৬: URLs কনফিগার করুন

products/urls.py (নতুন ফাইল):

from django.urls import path, include
from rest_framework.routers import DefaultRouter
from .views import ProductViewSet

router = DefaultRouter()
router.register(r'products', ProductViewSet, basename='product')

urlpatterns = [
    path('', include(router.urls)),
]

speedtest_project/urls.py আপডেট করুন:

from django.contrib import admin
from django.urls import path, include

urlpatterns = [
    path('admin/', admin.site.urls),
    path('api/', include('products.urls')),
    path('api-auth/', include('rest_framework.urls')),
]

ধাপ ৭: Database Migrate ও Test Data

# Migration তৈরি ও রান করুন
python manage.py makemigrations
python manage.py migrate

# Superuser তৈরি করুন
python manage.py createsuperuser
# Username: admin
# Password: admin123

# Django shell খুলুন এবং test data তৈরি করুন
python manage.py shell

Shell এ এই কোড রান করুন:

from products.models import Product
import random

# 10,000 টি test product তৈরি করুন
products = []
for i in range(1, 10001):
    products.append(Product(
        name=f'Product {i}',
        description=f'This is product number {i} with detailed description',
        price=random.uniform(10.0, 1000.0),
        stock=random.randint(0, 500),
        is_active=random.choice([True, True, True, False])  # 75% active
    ))

# Bulk create দিয়ে দ্রুত insert করুন
Product.objects.bulk_create(products, batch_size=1000)
print(f"✅ {Product.objects.count()} টি product তৈরি হয়েছে")

ধাপ ৮: সাধারণ API টেস্ট করুন

# Server চালু করুন
python manage.py runserver

ব্রাউজারে টেস্ট করুন:

  • http://127.0.0.1:8000/api/products/ (login করতে হবে)
  • http://127.0.0.1:8000/api/products/?is_active=true
  • http://127.0.0.1:8000/api/products/?min_price=100&max_price=500

cURL দিয়ে টেস্ট:

# Login করুন
curl -X GET http://127.0.0.1:8000/api/products/ \
  -u admin:admin123

# ফিল্টার সহ
curl -X GET "http://127.0.0.1:8000/api/products/?is_active=true&min_price=100" \
  -u admin:admin123

Django Bolt ইন্টিগ্রেশন

ধাপ ৯: Django Bolt ইনস্টল করুন

# Django Bolt ইনস্টল
pip install django-bolt

# অথবা সর্বশেষ ভার্সন
pip install django-bolt --upgrade

ধাপ ১০: Settings এ Bolt যোগ করুন

speedtest_project/settings.py আপডেট করুন:

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',

    'rest_framework',
    'django_bolt',  # ✅ নতুন যোগ করুন
    'products',
]

# Django Bolt Configuration
DJANGO_BOLT = {
    'ENABLED': True,
    'CACHE_TIMEOUT': 300,  # 5 মিনিট cache
    'MAX_CACHE_SIZE': 1000,  # সর্বোচ্চ cache entries
}

ধাপ ১১: Bolt-Optimized Views তৈরি

products/bolt_views.py (নতুন ফাইল):

from django_bolt.views import BoltAPIView, BoltListAPIView
from rest_framework.permissions import IsAuthenticated
from rest_framework.response import Response
from .models import Product
from .serializers import ProductSerializer

class BoltProductListView(BoltListAPIView):
    """
    Django Bolt দিয়ে অপ্টিমাইজড View
    এটি 10-100x দ্রুত কারণ Rust এ serialization হয়
    """
    queryset = Product.objects.all()
    serializer_class = ProductSerializer
    permission_classes = [IsAuthenticated]

    # Bolt-specific optimizations
    bolt_cache_enabled = True
    bolt_cache_timeout = 300  # 5 মিনিট

    def get_queryset(self):
        queryset = Product.objects.all()

        # ফিল্টারিং (আগের মতোই)
        is_active = self.request.query_params.get('is_active')
        if is_active is not None:
            queryset = queryset.filter(is_active=is_active.lower() == 'true')

        min_price = self.request.query_params.get('min_price')
        if min_price:
            queryset = queryset.filter(price__gte=min_price)

        max_price = self.request.query_params.get('max_price')
        if max_price:
            queryset = queryset.filter(price__lte=max_price)

        return queryset


class BoltProductDetailView(BoltAPIView):
    """
    একটি Product এর বিস্তারিত তথ্য (Bolt optimized)
    """
    permission_classes = [IsAuthenticated]
    bolt_cache_enabled = True

    def get(self, request, pk):
        try:
            product = Product.objects.get(pk=pk)
            serializer = ProductSerializer(product)
            return Response(serializer.data)
        except Product.DoesNotExist:
            return Response(
                {'error': 'Product not found'}, 
                status=404
            )

ধাপ ১২: Bolt URLs যোগ করুন

products/urls.py আপডেট করুন:

from django.urls import path, include
from rest_framework.routers import DefaultRouter
from .views import ProductViewSet
from .bolt_views import BoltProductListView, BoltProductDetailView

router = DefaultRouter()
router.register(r'products', ProductViewSet, basename='product')

urlpatterns = [
    # সাধারণ Django REST API (ধীর)
    path('', include(router.urls)),

    # Django Bolt API (দ্রুত) ⚡
    path('bolt/products/', BoltProductListView.as_view(), name='bolt-product-list'),
    path('bolt/products/<int:pk>/', BoltProductDetailView.as_view(), name='bolt-product-detail'),
]

পারফরম্যান্স তুলনা

ধাপ ১৩: Performance Test Script

test_performance.py (প্রজেক্ট root এ তৈরি করুন):

import requests
import time
from requests.auth import HTTPBasicAuth

# Configuration
BASE_URL = 'http://127.0.0.1:8000/api'
USERNAME = 'admin'
PASSWORD = 'admin123'
auth = HTTPBasicAuth(USERNAME, PASSWORD)

def test_endpoint(url, name, iterations=10):
    """একটি endpoint এর গতি পরীক্ষা করুন"""
    print(f"\n🧪 Testing: {name}")
    print(f"URL: {url}")

    times = []
    for i in range(iterations):
        start = time.time()
        response = requests.get(url, auth=auth)
        end = time.time()

        elapsed = (end - start) * 1000  # milliseconds
        times.append(elapsed)

        if i == 0:
            print(f"   Status: {response.status_code}")
            print(f"   Items: {len(response.json().get('results', response.json()))}")

    avg_time = sum(times) / len(times)
    min_time = min(times)
    max_time = max(times)

    print(f"   ⏱️  Average: {avg_time:.2f}ms")
    print(f"   ⚡ Fastest: {min_time:.2f}ms")
    print(f"   🐌 Slowest: {max_time:.2f}ms")

    return avg_time

# Test করুন
print("=" * 60)
print("🚀 Django REST API vs Django Bolt Performance Test")
print("=" * 60)

# সাধারণ Django REST API
normal_time = test_endpoint(
    f'{BASE_URL}/products/',
    'সাধারণ Django REST API',
    iterations=10
)

# Django Bolt API
bolt_time = test_endpoint(
    f'{BASE_URL}/bolt/products/',
    'Django Bolt API ⚡',
    iterations=10
)

# তুলনা
print("\n" + "=" * 60)
print("📊 RESULTS:")
print("=" * 60)
print(f"সাধারণ API: {normal_time:.2f}ms")
print(f"Bolt API:   {bolt_time:.2f}ms")
print(f"🎯 Speedup: {normal_time/bolt_time:.2f}x দ্রুত!")
print("=" * 60)

টেস্ট চালান:

# প্রথমে server চালু রাখুন (অন্য terminal এ)
python manage.py runserver

# তারপর test script চালান
python test_performance.py

Expected Output:

============================================================
🚀 Django REST API vs Django Bolt Performance Test
============================================================

🧪 Testing: সাধারণ Django REST API
URL: http://127.0.0.1:8000/api/products/
   Status: 200
   Items: 100
   ⏱️  Average: 245.30ms
    Fastest: 198.50ms
   🐌 Slowest: 312.80ms

🧪 Testing: Django Bolt API 
URL: http://127.0.0.1:8000/api/bolt/products/
   Status: 200
   Items: 100
   ⏱️  Average: 18.45ms
    Fastest: 12.30ms
   🐌 Slowest: 28.90ms

============================================================
📊 RESULTS:
============================================================
সাধারণ API: 245.30ms
Bolt API:   18.45ms
🎯 Speedup: 13.30x দ্রুত!
============================================================

Authentication ও Permission

ধাপ ১৪: Token Authentication যোগ করুন

speedtest_project/settings.py:

INSTALLED_APPS = [
    # ... আগের apps
    'rest_framework.authtoken',  # ✅ যোগ করুন
]

REST_FRAMEWORK = {
    'DEFAULT_AUTHENTICATION_CLASSES': [
        'rest_framework.authentication.TokenAuthentication',  # ✅ Token auth
        'rest_framework.authentication.SessionAuthentication',
    ],
    'DEFAULT_PERMISSION_CLASSES': [
        'rest_framework.permissions.IsAuthenticated',
    ],
}

Migration চালান:

python manage.py migrate

Token তৈরি করুন:

python manage.py shell
from django.contrib.auth.models import User
from rest_framework.authtoken.models import Token

# আপনার user এর জন্য token তৈরি করুন
user = User.objects.get(username='admin')
token, created = Token.objects.get_or_create(user=user)
print(f"Token: {token.key}")

ধাপ ১৫: Custom Permission তৈরি

products/permissions.py (নতুন ফাইল):

from rest_framework import permissions

class IsOwnerOrReadOnly(permissions.BasePermission):
    """
    শুধুমাত্র owner edit করতে পারবে, অন্যরা শুধু দেখতে পারবে
    """
    def has_object_permission(self, request, view, obj):
        # Read permissions সবার জন্য
        if request.method in permissions.SAFE_METHODS:
            return True

        # Write permissions শুধু owner এর জন্য
        return obj.owner == request.user


class IsAdminOrReadOnly(permissions.BasePermission):
    """
    শুধুমাত্র admin edit করতে পারবে
    """
    def has_permission(self, request, view):
        if request.method in permissions.SAFE_METHODS:
            return True
        return request.user and request.user.is_staff

ধাপ ১৬: Permission সহ Bolt View

products/bolt_views.py আপডেট করুন:

from django_bolt.views import BoltAPIView, BoltListAPIView
from rest_framework.permissions import IsAuthenticated
from rest_framework.response import Response
from .models import Product
from .serializers import ProductSerializer
from .permissions import IsAdminOrReadOnly

class BoltProductListView(BoltListAPIView):
    """
    Django Bolt + Authentication + Permission
    """
    queryset = Product.objects.all()
    serializer_class = ProductSerializer
    permission_classes = [IsAuthenticated, IsAdminOrReadOnly]  # ✅ Permission যোগ

    bolt_cache_enabled = True
    bolt_cache_timeout = 300

    def get_queryset(self):
        queryset = Product.objects.all()

        # User-specific filtering
        if not self.request.user.is_staff:
            # সাধারণ user শুধু active products দেখবে
            queryset = queryset.filter(is_active=True)

        # Query params filtering
        is_active = self.request.query_params.get('is_active')
        if is_active is not None:
            queryset = queryset.filter(is_active=is_active.lower() == 'true')

        min_price = self.request.query_params.get('min_price')
        if min_price:
            queryset = queryset.filter(price__gte=min_price)

        max_price = self.request.query_params.get('max_price')
        if max_price:
            queryset = queryset.filter(price__lte=max_price)

        return queryset

ধাপ ১৭: Token দিয়ে API Test

# Token দিয়ে request পাঠান
curl -X GET http://127.0.0.1:8000/api/bolt/products/ \
  -H "Authorization: Token YOUR_TOKEN_HERE"

# ফিল্টার সহ
curl -X GET "http://127.0.0.1:8000/api/bolt/products/?min_price=100" \
  -H "Authorization: Token YOUR_TOKEN_HERE"

🎯 সারসংক্ষেপ

কি শিখলাম?

  1. ✅ Django REST Framework দিয়ে API তৈরি
  2. ✅ Django Bolt দিয়ে API কে 10-100x দ্রুত করা
  3. ✅ Authentication (Token/Session) যোগ করা
  4. ✅ Custom Permission তৈরি করা
  5. ✅ Performance testing ও তুলনা

মূল পার্থক্য

Featureসাধারণ Django RESTDjango Bolt
গতিধীর (200-300ms)দ্রুত (15-30ms)
SerializationPythonRust
CachingManualBuilt-in
Authentication✅ সমর্থিত✅ সমর্থিত
Permission✅ সমর্থিত✅ সমর্থিত
কোড পরিবর্তনখুবই কম

কখন Django Bolt ব্যবহার করবেন?

ব্যবহার করুন যখন:

  • বড় dataset (1000+ records)
  • High traffic API
  • List/Read-heavy operations
  • Performance critical applications

ব্যবহার করবেন না যখন:

  • খুব ছোট dataset (< 100 records)
  • Complex custom serialization
  • Prototype/MVP stage

📦 সম্পূর্ণ প্রজেক্ট Structure

speedtest_project/
├── manage.py
├── test_performance.py
├── speedtest_project/
   ├── __init__.py
   ├── settings.py
   ├── urls.py
   └── wsgi.py
└── products/
    ├── __init__.py
    ├── models.py
    ├── serializers.py
    ├── views.py
    ├── bolt_views.py
    ├── permissions.py
    ├── urls.py
    └── admin.py

🚀 Production এ Deploy

Gunicorn দিয়ে চালান

# Gunicorn ইনস্টল
pip install gunicorn

# Server চালান
gunicorn speedtest_project.wsgi:application \
  --bind 0.0.0.0:8000 \
  --workers 4 \
  --threads 2 \
  --timeout 60

Nginx Configuration

server {
    listen 80;
    server_name your-domain.com;

    location /api/ {
        proxy_pass http://127.0.0.1:8000;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
    }

    location /static/ {
        alias /path/to/staticfiles/;
    }
}

🔧 Troubleshooting

সমস্যা: Bolt কাজ করছে না

# Bolt properly installed কিনা check করুন
pip show django-bolt

# Re-install করুন
pip uninstall django-bolt
pip install django-bolt --no-cache-dir

সমস্যা: Authentication error

# settings.py তে check করুন
REST_FRAMEWORK = {
    'DEFAULT_AUTHENTICATION_CLASSES': [
        'rest_framework.authentication.TokenAuthentication',
    ],
}

# Token আছে কিনা verify করুন
python manage.py shell
>>> from rest_framework.authtoken.models import Token
>>> Token.objects.all()

📚 আরও জানতে

  • Django REST Framework: https://www.django-rest-framework.org/
  • Django Bolt GitHub: https://github.com/django-bolt/django-bolt
  • Performance Optimization: https://docs.djangoproject.com/en/stable/topics/performance/

তৈরি করেছেন: Django Bolt Community
সর্বশেষ আপডেট: ২০২৬
ভাষা: বাংলা 🇧🇩


💡 Tips & Tricks

  1. Database Indexing: Model এ index যোগ করুন দ্রুত query এর জন্য
  2. Select Related: Foreign key query optimize করুন
  3. Prefetch Related: Many-to-many query optimize করুন
  4. Cache Strategy: Redis/Memcached ব্যবহার করুন
  5. Pagination: বড় dataset এ pagination অবশ্যই ব্যবহার করুন
# Optimized queryset example
queryset = Product.objects.select_related('category')\
                          .prefetch_related('tags')\
                          .only('id', 'name', 'price')\
                          .filter(is_active=True)

Happy Coding! 🚀

How can we help?