۱۳.
چطور باید چند-مستاجری (Multi-Tenancy) را در Django مدیریت کنم؟جواب کوتاه:
به همهی مدلها یک فیلد tenant اضافه کن و همیشه موقع query گرفتن، بر اساس tenant فیلتر کن.این سادهترین و رایجترین روشه.
رویکرد ۱:
Shared Schema + tenant_id (سادهترین و برای ۹۰٪ پروژهها کافی)
هر مدل یک tenant دارد:
class Tenant(models.Model):
name = models.CharField(max_length=100)
domain = models.CharField(max_length=100, unique=True)
class Post(models.Model):
tenant = models.ForeignKey(Tenant, on_delete=models.CASCADE)
title = models.CharField(max_length=200)
content = models.TextField()
Middleware برای پیدا کردن tenant از روی دامنه:
class TenantMiddleware:
def __init__(self, get_response):
self.get_response = get_response
def __call__(self, request):
domain = request.get_host()
request.tenant = Tenant.objects.get(domain=domain)
return self.get_response(request)
ویوها بهصورت خودکار tenant را فیلتر میکنند:
def post_list(request):
posts = Post.objects.filter(tenant=request.tenant)
return render(request, 'posts.html', {'posts': posts})
مزایا:- ساده
- بدون نیاز به ساختار پیچیده
- مناسب SaaS ساده، MVP، پنلهای سازمانی
معایب:- همه tenant ها در یک دیتابیس
- اگر یک tenant دیتابیس را overload کند، روی بقیه هم اثر دارد
رویکرد ۲:
یک دیتابیس/Schema جدا برای هر tenant (پیچیدهتر ولی isolation کامل)
برای پروژههای خیلی بزرگ یا با سطح امنیتی بالا.
INSTALLED_APPS += ['django_tenants']
DATABASE_ROUTERS = ['django_tenants.routers.TenantSyncRouter']
class Tenant(TenantMixin):
name = models.CharField(max_length=100)
domain_url = models.CharField(max_length=128, unique=True)
Django Tenants بهصورت خودکار درخواستها را به schema درست میفرستد:
posts = Post.objects.all() # فقط دادههای tenant فعلی
مزایا:- جدا شدن کامل دادهها
- هر tenant میتونه نسخه مخصوص خودش داشته باشه
معایب:- Migrationها پیچیدهتر میشن
- نگهداری سختتر
- راهاندازی و DevOps سنگین
قانون من:
اگر دلیل امنیتی یا قانونی خیلی جدی نداری، از رویکرد ۱ (shared schema) استفاده کن.۹۰٪ مواقع کاملاً کفایت میکنه.
پ.ن: یادتون نره پستا رو با دوستاتون به اشتراک بذارید ❤️❤️
پارت اول ۲۰ سوال جنگوپارت دوم ۲۰ سوال جنگوپارت سوم ۲۰ سوال جنگوپارت چهارم ۲۰ سوال جنگوپارت پنجم ۲۰ سوال جنگوپارت ششم ۲۰ سوال جنگوپارت هفتم ۲۰ سوال جنگوپارت هشتم ۲۰ سوال جنگوپارت نهم ۲۰ سوال جنگوپارت دهم ۲۰ سوال جنگوپارت یازدهم ۲۰ سوال جنگوپارت دوازدهم ۲۰ سوال جنگو#پارت_سیزدهم #جنگو #django #پایتون #برنامه_نویسی
@PhiloLearn