Django-Tenants میں سب ڈومین لاگ ان کیوں ٹوٹ جاتے ہیں: ایک حقیقی دنیا کی پہیلی
ایک کثیر کرایہ دار Django ایپلیکیشن بنانے کا تصور کریں جہاں ہر ذیلی ڈومین ایک مختلف کرایہ دار کی خدمت کرتا ہے، بغیر کسی رکاوٹ کے صارف کی تصدیق کو مربوط کرتا ہے۔ سب کچھ کامل لگتا ہے — جب تک کہ ذیلی ڈومین پر لاگ ان صفحہ خوفناک نہ پھینکے۔ . آپ اپنا سر کھجاتے ہیں، سوچتے ہیں کہ کیوں؟ لاگ ان بے عیب کام کرتا ہے، لیکن ذیلی ڈومین لاگ ان نہیں ہوتا ہے۔ 🤔
یہ مسئلہ مایوس کن ہے کیونکہ یہ ایک تضاد کی طرح محسوس ہوتا ہے: سسٹم واضح طور پر صارفین کو پہچانتا ہے کیونکہ آپ ایڈمن پینل میں لاگ ان ہو سکتے ہیں۔ ایک بار لاگ ان ہونے کے بعد، آپ کرایہ دار کے مخصوص صفحات تک رسائی حاصل کر سکتے ہیں اور یہاں تک کہ کامیابی سے فارم جمع کر سکتے ہیں۔ پھر بھی، جب آپ لاگ ان صفحہ کو مارتے ہیں، ایک خامی ابھرتی ہے: ہڈ کے نیچے واقعی کیا ہو رہا ہے؟
مجھے ایک متعلقہ مثال شیئر کرنے دو۔ یہ گھر کے دو دروازے رکھنے کی طرح ہے—ایک مہمانوں کے لیے (آپ کا مرکزی ڈومین) اور دوسرا خاندان کے لیے (سب ڈومینز)۔ مہمان کا دروازہ ٹھیک کام کرتا ہے، لیکن خاندانی دروازہ جام ہوجاتا ہے۔ آپ جانتے ہیں کہ چابیاں درست ہیں، لیکن لاک میکانزم کے ساتھ کچھ گہرا گڑبڑ ہے — جیسے ڈیٹا بیس سکیما کے سوالات میں غیر متوقع طور پر مماثلت۔
اس مسئلے کی جڑ جینگو ریسٹ فریم ورک کے طریقہ کار میں ہے۔ کے ساتھ تعامل کرتا ہے۔ لائبریری خاص طور پر، ٹوکنز کے خلاف استفسار کیا جاتا ہے۔ کرایہ دار اسکیما کے بجائے، جس کی وجہ سے a فارن کی خلاف ورزی غلطی آئیے اس مسئلے میں غوطہ لگائیں، اس کی وجہ دریافت کریں، اور اپنے سبھی ذیلی ڈومینز کے لاگ ان دروازے کو درست کریں! 🔧
حکم | استعمال کی مثال |
---|---|
schema_context() | کثیر کرایہ دار Django سیٹ اپ میں اسکیموں کے درمیان سوئچ کرنے کی اجازت دیتا ہے۔ مثال: schema_context('tenant_name') کے ساتھ: اس بات کو یقینی بناتا ہے کہ مخصوص کرایہ دار کے ڈیٹا بیس اسکیما میں کارروائیاں انجام دی جائیں۔ |
authenticate() | صارف کو ان کی اسناد کا استعمال کرتے ہوئے تصدیق کرتا ہے۔ مثال: user=authenticate(request, username=username, password=password) چیک کرتا ہے کہ آیا فراہم کردہ اسناد درست ہیں۔ |
Token.objects.get_or_create() | کسی صارف کے لیے موجودہ ٹوکن بازیافت کرتا ہے یا اگر موجود نہیں ہے تو اسے تخلیق کرتا ہے۔ مثال: ٹوکن، تخلیق = Token.objects.get_or_create(user=user)۔ |
csrf_exempt | ایک مخصوص منظر کے لیے CSRF تحفظ کو غیر فعال کرتا ہے۔ مثال: @csrf_exempt بیرونی یا غیر براؤزر API کی درخواستوں کو سنبھالتے وقت استعمال کیا جاتا ہے۔ |
connection.tenant.schema_name | Django ملٹی کرایہ دار ایپ میں موجودہ کرایہ دار کے اسکیما کا نام بازیافت کرتا ہے۔ مثال: tenant_schema_name = connection.tenant.schema_name۔ |
JsonResponse() | HTTP جواب کے طور پر JSON فارمیٹ شدہ ڈیٹا لوٹاتا ہے۔ مثال: واپس JsonResponse({"status": "کامیابی"، "token": token.key})۔ |
APIClient() | ایک Django Rest Framework ٹیسٹنگ کلائنٹ جو ٹیسٹوں میں HTTP درخواستوں کی نقل کرنے کی اجازت دیتا ہے۔ مثال: self.client = APIClient()۔ |
localStorage.setItem() | براؤزر کے مقامی اسٹوریج میں کلیدی قدر کے جوڑے کو محفوظ کرتا ہے۔ مثال: localStorage.setItem('token', data.token) ٹوکن کو مستقبل کے استعمال کے لیے اسٹور کرتا ہے۔ |
Swal.fire() | SweetAlert2 لائبریری کا استعمال کرتے ہوئے الرٹ پاپ اپ دکھاتا ہے۔ مثال: Swal.fire({icon: 'error', title: 'Login Failed'}) ایک اسٹائل شدہ غلطی کا پیغام دکھاتا ہے۔ |
TestCase | جینگو میں یونٹ ٹیسٹ لکھنے کے لیے استعمال کیا جاتا ہے۔ مثال: کلاس TenantLoginTest(TestCase): اسکیما کے لیے مخصوص لاگ ان ٹیسٹنگ کے لیے ایک ٹیسٹ کلاس بناتا ہے۔ |
جینگو کرایہ داروں میں کرایہ دار کی مخصوص تصدیق میں مہارت حاصل کرنا
اوپر فراہم کردہ اسکرپٹ ملٹی ٹیننٹ جینگو ایپلی کیشنز میں ایک اہم مسئلہ کو حل کرتی ہیں جہاں ٹوکنز سے استفسار کیا جاتا ہے مناسب کرایہ دار اسکیما کے بجائے۔ یہ رویہ اس لیے ہوتا ہے کیونکہ Django Rest Framework (DRF) ٹوکن ماڈلز کے ساتھ تعامل کرتے وقت اسکیموں کو خود بخود تبدیل نہیں کرتا ہے۔ اس کو حل کرنے کے لیے، ہم فائدہ اٹھاتے ہیں۔ لائبریری کی طریقہ، ہمیں واضح طور پر صحیح کرایہ دار کے اسکیما کے اندر ڈیٹا بیس کے سوالات کو انجام دینے کی اجازت دیتا ہے۔ یہ یقینی بناتا ہے کہ صارف کی توثیق اور ٹوکن کی بازیافت ہر کرایہ دار کے لیے بغیر کسی رکاوٹ کے کام کرتی ہے، چاہے اس تک رسائی بنیادی ڈومین یا ذیلی ڈومینز کے ذریعے کی گئی ہو۔ اس ایڈجسٹمنٹ کے بغیر، ForeignKeyViolation کی خرابی واقع ہوتی ہے کیونکہ سسٹم غلط اسکیما میں صارف کے ریکارڈ کو تلاش کرتا ہے۔
'dual_login_view' فنکشن یہ ظاہر کرتا ہے کہ کرایہ دار اسکیما کی طرف ڈیٹا بیس کنکشن پوائنٹس کو یقینی بناتے ہوئے صارفین کی توثیق کیسے کی جائے۔ سب سے پہلے، یہ درخواست کے پے لوڈ سے صارف نام اور پاس ورڈ نکالتا ہے۔ پھر، `استثنیٰ` طریقہ استعمال کرتے ہوئے، یہ اسناد کی توثیق کرتا ہے۔ اگر کامیاب ہوتا ہے، تو یہ صارف کو لاگ ان کرتا ہے اور DRF کے `Token.objects.get_or_create()` طریقہ کا استعمال کرتے ہوئے ایک ٹوکن تیار کرتا ہے۔ یہ یقینی بنانے کے لیے کہ یہ استفسار درست اسکیما کو نشانہ بناتا ہے، `schema_context` فنکشن منطق کو سمیٹتا ہے، ڈیٹا بیس کے سیاق و سباق کو فعال کرایہ دار اسکیما میں تبدیل کرتا ہے۔ یہ اس بات کی ضمانت دیتا ہے کہ سسٹم درست صارف اور ٹوکن ریکارڈز کو تلاش کر سکتا ہے، جس سے سکیما کی مماثلت کی خرابی ختم ہو جاتی ہے۔
'TenantAwareLoginAPIView' کلاس ماڈیولر اپروچ کے لیے Django Rest Framework کے APIView کو اپنا کر حل کو بہتر بناتی ہے۔ یہ صارف کی اسناد پر مشتمل POST کی درخواستوں کو قبول کرتا ہے، انہیں `استثنیٰ` کا استعمال کرتے ہوئے توثیق کرتا ہے، اور اگر اسناد درست ہیں تو ایک ٹوکن تیار کرتا ہے۔ اہم بات یہ ہے کہ یہ صحیح کرایہ دار اسکیما کے اندر تمام کارروائیوں کو انجام دینے کے لیے `schema_context` کا استعمال کرتا ہے۔ یہ کلاس پر مبنی نقطہ نظر جدید API کے نفاذ کے لیے مثالی ہے کیونکہ یہ ایرر ہینڈلنگ کو مرکزی بناتا ہے اور صاف ستھرا، منظم جوابات فراہم کرتا ہے۔ مثال کے طور پر، JSON ٹوکن واپس کرنا یقینی بناتا ہے کہ فرنٹ اینڈ اسے مقامی اسٹوریج میں اسٹور کر سکتا ہے اور بعد میں تصدیق شدہ درخواستوں کے لیے استعمال کر سکتا ہے۔
فرنٹ اینڈ پر، JavaScript فارم جمع کرانے کا اسکرپٹ لاگ ان اینڈ پوائنٹ پر محفوظ اور منظم درخواستیں کرنے میں کلیدی کردار ادا کرتا ہے۔ یہ ڈیفالٹ فارم کے رویے کو روکتا ہے، ان پٹ فیلڈز کی توثیق کرتا ہے، اور CSRF ٹوکن کے ساتھ ایک fetch API کی درخواست کے ذریعے اسناد بھیجتا ہے۔ کامیاب جواب موصول ہونے پر، ٹوکن کو `localStorage` میں محفوظ کیا جاتا ہے اور صارف کو ری ڈائریکٹ کیا جاتا ہے۔ اگر سرور غلطی لوٹاتا ہے، تو SweetAlert2 لائبریری ایک دوستانہ الرٹ پیغام دکھاتی ہے۔ یہ صارف کے تجربے کو ہموار بناتا ہے اور مناسب غلطی کے تاثرات کو یقینی بناتا ہے۔ مثال کے طور پر، کرایہ دار کے ذیلی ڈومین تک رسائی حاصل کرنے پر، درست اسناد کے ساتھ لاگ ان کرنے والے صارف کو فوری طور پر کامیابی کا پیغام نظر آئے گا اور اسے ایپلیکیشن ڈیش بورڈ پر بھیج دیا جائے گا۔ 🔒
جیانگو کرایہ داروں میں سب ڈومین لاگ ان کے مسائل کو آپٹمائزڈ سکیما کے سوالات کے ساتھ ہینڈل کرنا
واضح اسکیما کے انتخاب اور غلطی سے نمٹنے کے ساتھ Django ORM کا استعمال کرتے ہوئے بیک اینڈ حل۔
# Import necessary libraries
from django.db import connection
from rest_framework.authtoken.models import Token
from django.contrib.auth import authenticate, login
from django.http import JsonResponse
from django_tenants.utils import schema_context
from django.views.decorators.csrf import csrf_exempt
@csrf_exempt
def dual_login_view(request):
"""Handle login for multi-tenant subdomains with correct schema."""
if request.method == "POST":
username = request.POST.get("login")
password = request.POST.get("password")
tenant_schema_name = connection.tenant.schema_name
try:
# Switch to the correct tenant schema
with schema_context(tenant_schema_name):
user = authenticate(request, username=username, password=password)
if user is not None:
login(request, user)
# Generate or retrieve token
token, created = Token.objects.get_or_create(user=user)
return JsonResponse({"status": "success", "token": token.key})
else:
return JsonResponse({"status": "error", "message": "Invalid credentials"}, status=400)
except Exception as e:
return JsonResponse({"status": "error", "message": str(e)}, status=500)
return JsonResponse({"status": "error", "message": "Invalid request method"}, status=405)
کرایہ دار سے آگاہ اسکیموں کا استعمال کرتے ہوئے واضح ٹوکن مینجمنٹ
کثیر کرایہ دار فن تعمیر میں لاگ ان کرنے کے لیے ماڈیولرائزڈ اور دوبارہ قابل استعمال Django API ویو۔
from rest_framework.views import APIView
from rest_framework.response import Response
from rest_framework import status
from django.contrib.auth import authenticate
from rest_framework.authtoken.models import Token
from django_tenants.utils import schema_context
class TenantAwareLoginAPIView(APIView):
"""Login endpoint that ensures tenant-aware schema handling."""
def post(self, request):
username = request.data.get("username")
password = request.data.get("password")
tenant_schema_name = request.tenant.schema_name
if not username or not password:
return Response({"error": "Username and password required"}, status=status.HTTP_400_BAD_REQUEST)
try:
with schema_context(tenant_schema_name):
user = authenticate(request, username=username, password=password)
if user is None:
return Response({"error": "Invalid credentials"}, status=status.HTTP_401_UNAUTHORIZED)
# Generate or retrieve token for the user
token, created = Token.objects.get_or_create(user=user)
return Response({"token": f"Token {token.key}"}, status=status.HTTP_200_OK)
except Exception as e:
return Response({"error": str(e)}, status=status.HTTP_500_INTERNAL_SERVER_ERROR)
سب ڈومین لاگ ان کی درخواستوں کو سنبھالنے کے لیے فرنٹ اینڈ اسکرپٹ
کرایہ دار ذیلی ڈومینز کے لیے فارم جمع کرانے اور ٹوکن پر مبنی لاگ ان پر کارروائی کرنے کے لیے JavaScript حل۔
<script>
document.querySelector('form').addEventListener('submit', function(event) {
event.preventDefault();
let form = event.target;
let formData = new FormData(form);
fetch("{% url 'tenant_aware_login' %}", {
method: 'POST',
body: JSON.stringify(Object.fromEntries(formData)),
headers: {
'Content-Type': 'application/json',
'X-CSRFToken': formData.get('csrfmiddlewaretoken')
}
})
.then(response => {
if (!response.ok) throw new Error('Server Error');
return response.json();
})
.then(data => {
if (data.token) {
localStorage.setItem('token', data.token);
window.location.href = '/';
} else {
Swal.fire({
icon: 'error',
title: 'Login Failed',
text: data.error || 'Invalid credentials'
});
}
})
.catch(error => {
console.error('Error:', error);
});
});
</script>
سکیما سے آگاہ ٹوکن کی توثیق کے لیے یونٹ ٹیسٹ
پائیتھون میں یونٹ ٹیسٹ اس بات کو یقینی بنانے کے لیے کہ API اسکیما سوئچنگ کو صحیح طریقے سے ہینڈل کرتا ہے۔
from django.test import TestCase
from rest_framework.test import APIClient
from django_tenants.utils import schema_context
from django.contrib.auth.models import User
from rest_framework.authtoken.models import Token
class TenantLoginTest(TestCase):
def setUp(self):
self.client = APIClient()
with schema_context('test_tenant'): # Switch to tenant schema
self.user = User.objects.create_user(username='testuser', password='testpass')
def test_successful_login(self):
with schema_context('test_tenant'):
response = self.client.post('/api/login/', {
'username': 'testuser',
'password': 'testpass'
})
self.assertEqual(response.status_code, 200)
self.assertIn('token', response.json())
def test_invalid_login(self):
with schema_context('test_tenant'):
response = self.client.post('/api/login/', {
'username': 'wronguser',
'password': 'wrongpass'
})
self.assertEqual(response.status_code, 401)
self.assertIn('error', response.json())
ملٹی ٹیننٹ جینگو ایپس میں کرایہ دار کے لیے مخصوص ٹوکن سوالات کے کردار کو سمجھنا
کا ایک اہم پہلو اس بات کو یقینی بنا رہا ہے کہ ڈیٹا بیس کی کارروائیاں ہمیشہ درست کرایہ دار اسکیما کے اندر ہوتی ہیں۔ اس معاملے میں مسئلہ اس لیے پیش آتا ہے کیونکہ جینگو کا ڈیفالٹ رویہ ایک مشترکہ اسکیما کو فرض کرتا ہے، جس کے نتیجے میں غلطیاں پیدا ہوتی ہیں جب ٹوکن یا صارفین . جیسے ٹولز کا فائدہ اٹھا کر سے فنکشن جینگو کرایہ دار لائبریری، ہم واضح طور پر کرایہ دار سے متعلق سوالات کرنے کے لیے اسکیموں کے درمیان سوئچ کرتے ہیں۔ یہ اس بات کو یقینی بناتا ہے کہ صارفین اور ٹوکنز کے لیے توثیق کے سوالات کو درست اسکیما کی طرف لے جایا جاتا ہے۔
ایک اور اہم تفصیل جسے اکثر نظر انداز کیا جاتا ہے وہ یہ ہے کہ کیسے چلاتا ہے پہلے سے طے شدہ طور پر، یہ فعال ڈیٹا بیس اسکیما میں صارف کے ریکارڈز کو تلاش کرتا ہے۔ اگر موجودہ اسکیما غلط ہے تو، استفسار a کے ساتھ ناکام ہوجاتا ہے۔ غلطی اسے ٹھیک کرنے کے لیے، ہم اس بات کو یقینی بناتے ہیں کہ ٹوکن ماڈل سے متعلق کوئی بھی استفسار مناسب کرایہ دار اسکیما سیاق و سباق میں ہو۔ اس ایڈجسٹمنٹ کے بغیر، درست صارف بھی توثیق کرنے میں ناکام ہو جائیں گے کیونکہ صارف کی ID ڈیفالٹ سکیما میں موجود نہیں ہو سکتی۔
مزید برآں، فرنٹ اینڈ کوڈ ان بیک اینڈ پروسیسز کے ساتھ مؤثر طریقے سے بات چیت کرنے میں ایک اہم کردار ادا کرتا ہے۔ اس بات کو یقینی بنانا کہ fetch API بھیجتا ہے۔ اور JSON جوابات کو مناسب طریقے سے ہینڈل کرنا اہم ہے۔ مثال کے طور پر، API کالوں کو ٹرائی کیچ بلاکس میں لپیٹنا اور صارف دوست لائبریریوں کا استعمال کرتے ہوئے غلطیوں کو ہینڈل کرنا جیسے استعمال کو بہتر بناتا ہے. یہ اضافہ اس بات کو یقینی بناتا ہے کہ لاگ ان کا بہاؤ بغیر کسی رکاوٹ کے رہتا ہے، یہاں تک کہ جب ذیلی ڈومینز کے درمیان سوئچ کر رہے ہوں یا اسکیما سے متعلق مخصوص غلطیوں کا سامنا ہو۔ مثال کے طور پر، ایک SaaS پلیٹ فارم کا تصور کریں جہاں ہر کمپنی (کرایہ دار) ذیلی ڈومین استعمال کرتی ہے — اسکیما سیاق و سباق کو فکس کرنے سے ہر ملازم بغیر کسی رکاوٹ کے آسانی سے لاگ ان ہوتا ہے۔ 🚀
- کیا وجہ ہے a لاگ ان کے دوران؟
- خرابی اس لیے ہوتی ہے کیونکہ غلط اسکیما سے استفسار کرتا ہے، جس کی وجہ سے صارف کے ریکارڈ کو تلاش کرتے وقت مماثلت پیدا ہوتی ہے۔
- میں یہ کیسے یقینی بنا سکتا ہوں کہ ٹوکن کے سوالات صحیح کرایہ دار اسکیما کی طرف اشارہ کرتے ہیں؟
- استعمال کریں۔ سے استفسار کے عمل کو لپیٹنے اور صحیح اسکیما پر سوئچ کرنے کے لیے لائبریری۔
- ایڈمن پینل لاگ ان کیوں کام کرتا ہے لیکن صارف لاگ ان ناکام ہو جاتا ہے؟
- Django ایڈمن خودکار طور پر سکیما سیاق و سباق کو ایڈجسٹ کرتا ہے، لیکن اپنی مرضی کے مطابق خیالات کا استعمال کرتے ہوئے یا نہیں ہو سکتا جب تک کہ واضح طور پر تشکیل نہ دیا جائے۔
- میں فرنٹ اینڈ پر لاگ ان ٹوکن کیسے بازیافت اور ذخیرہ کروں؟
- اسناد بھیجنے کے لیے fetch API کا استعمال کریں، پھر جوابی ٹوکن کو استعمال کرکے اسٹور کریں۔ مسلسل تصدیق کے لیے۔
- میں ناکام لاگ ان کے لیے بہتر ایرر میسیجز کیسے دکھا سکتا ہوں؟
- جیسے لائبریریوں کا استعمال کرتے ہوئے فرنٹ اینڈ الرٹس کو نافذ کریں۔ غلط اسناد یا سرور کے مسائل کے بارے میں صارفین کو مطلع کرنے کے لیے۔
Django ملٹی ٹیننٹ ایپس میں لاگ ان کی ناکامیوں کو حل کرنے کے لیے اس بات کو یقینی بنانے کی ضرورت ہے کہ ڈیٹا بیس کے تمام سوالات مناسب اسکیما میں کام کریں۔ سکیما سیاق و سباق جیسے ٹولز کو واضح طور پر استعمال کر کے، ہم اس بات کی ضمانت دے سکتے ہیں کہ صارف کے ٹوکنز درست کرایہ دار ڈیٹا بیس سے حاصل کیے گئے ہیں، سکیما تنازعات سے بچتے ہیں۔
ایک SaaS پلیٹ فارم پر کام کرنے کا تصور کریں جہاں صارفین کو صرف ذیلی ڈومینز پر لاگ ان ناکامیوں کا سامنا کرنا پڑتا ہے۔ مناسب سکیما سوئچنگ کے ساتھ، یہ مسائل حل ہو جاتے ہیں، بغیر کسی رکاوٹ کی تصدیق کو یقینی بناتے ہوئے اس اصلاح کو اپنانے سے نہ صرف بہتری آتی ہے۔ بلکہ ہر کرایہ دار کے لیے محفوظ، موثر ڈیٹا تک رسائی کی ضمانت بھی دیتا ہے۔ 🔧
- پر تفصیلی دستاویزات لائبریری، کثیر کرایہ دار ایپلی کیشنز میں اسکیما مینجمنٹ کی وضاحت کرتی ہے۔ پر دستیاب ہے: جینگو - کرایہ داروں کی دستاویزات .
- ٹوکن کی توثیق پر آفیشل جینگو ریسٹ فریم ورک (DRF) دستاویزات۔ پر مزید جانیں: DRF ٹوکن کی توثیق .
- کثیر کرایہ دار ماحول میں schema_context استعمال کرنے کے بارے میں جامع گائیڈ۔ پر ملا: GitHub - جیانگو کرایہ دار .
- جینگو ایپلی کیشنز میں CSRF ٹوکن کو سنبھالنے کے بارے میں بصیرت: جینگو سی ایس آر ایف دستاویزات .
- کثیر کرایہ دار SaaS پلیٹ فارم ڈیزائن کرنے کے بہترین طریقے، بشمول صارف کی توثیق: SaaS Pegasus ملٹی ٹیننسی گائیڈ .