Django Bolt দিয়ে Django REST API দ্রুততর করার সম্পূর্ণ গাইড
📚 সূচিপত্র
- Django Bolt কি এবং কেন ব্যবহার করবেন
- প্রজেক্ট সেটআপ – স্টেপ বাই স্টেপ
- সাধারণ Django REST API তৈরি
- Django Bolt দিয়ে স্পিড বৃদ্ধি
- পারফরম্যান্স তুলনা
- 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 shellShell এ এই কোড রান করুন:
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:admin123Django 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.pyExpected 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 migrateToken তৈরি করুন:
python manage.py shellfrom 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"🎯 সারসংক্ষেপ
কি শিখলাম?
- ✅ Django REST Framework দিয়ে API তৈরি
- ✅ Django Bolt দিয়ে API কে 10-100x দ্রুত করা
- ✅ Authentication (Token/Session) যোগ করা
- ✅ Custom Permission তৈরি করা
- ✅ Performance testing ও তুলনা
মূল পার্থক্য
| Feature | সাধারণ Django REST | Django Bolt |
|---|---|---|
| গতি | ধীর (200-300ms) | দ্রুত (15-30ms) |
| Serialization | Python | Rust |
| Caching | Manual | Built-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 60Nginx 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
- Database Indexing: Model এ index যোগ করুন দ্রুত query এর জন্য
- Select Related: Foreign key query optimize করুন
- Prefetch Related: Many-to-many query optimize করুন
- Cache Strategy: Redis/Memcached ব্যবহার করুন
- 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! 🚀