آنچه در این مقاله میخوانید [پنهانسازی]
Middleware در Django لایهای بین درخواست کاربر و پاسخ سرور است که به شما اجازه میدهد قبل از رسیدن درخواست به View یا قبل از ارسال پاسخ به کاربر، پردازشهای مختلفی انجام دهید. بسیاری از قابلیتهای مهم Django مانند مدیریت Session، احراز هویت کاربران، امنیت و مدیریت پیامها از طریق Middleware پیاده سازی شدهاند و بدون آن بخش بزرگی از امکانات فریم ورک از کار میافتد.
سرفصل های مقاله
- Middleware در Django چیست؟
- Middleware در چه مرحلهای اجرا میشود؟
- چرا Middleware در Django اهمیت دارد؟
- Middlewareهای پیش فرض Django
- SessionMiddleware چه کاری انجام میدهد؟
- AuthenticationMiddleware چه کاربردی دارد؟
- CsrfViewMiddleware چه کاری انجام میدهد؟
- SecurityMiddleware چه کاربردی دارد؟
- Middleware سفارشی چیست؟
- ساخت Middleware سفارشی
- فعال کردن Middleware
- Middleware قبل از View
- Middleware بعد از View
- کاربردهای رایج Middleware در پروژههای واقعی
- Middleware و Performance
- اشتباهات رایج هنگام استفاده از Middleware
- اجرای Query سنگین
- استفاده از Middleware برای منطق نامرتبط
- ترتیب اشتباه Middlewareها
- نوشتن Middleware بسیار پیچیده
- چه زمانی باید از Middleware استفاده کنیم؟
- Middleware یا Decorator؟
- جمع بندی
Middleware در Django چیست؟
هر درخواست که به پروژه Django ارسال میشود، قبل از رسیدن به View از چندین Middleware عبور میکند.
بعد از تولید Response نیز همین مسیر به صورت معکوس طی میشود.
به زبان ساده، Middleware مانند یک فیلتر یا واسطه عمل میکند که میتواند:
- درخواست را بررسی کند
- اطلاعاتی به آن اضافه کند
- درخواست را متوقف کند
- پاسخ را تغییر دهد
بدون اینکه نیازی به تغییر View ها باشد.
Middleware در چه مرحلهای اجرا میشود؟
مسیر کلی پردازش درخواست در Django به این شکل است:
Request
↓
Middleware
↓
URL Routing
↓
View
↓
Response
↓
Middleware
↓
Browser
هر Middleware میتواند قبل یا بعد از اجرای View عملیات خاصی انجام دهد.
چرا Middleware در Django اهمیت دارد؟
فرض کنید میخواهید:
- IP کاربران را ثبت کنید
- زمان پاسخ سرور را اندازه گیری کنید
- دسترسی کاربران را کنترل کنید
- درخواستهای مشکوک را مسدود کنید
اگر این منطق را داخل تمام Viewها قرار دهید، پروژه به سرعت پیچیده میشود.
Middleware این مشکل را حل می کند.
Middlewareهای پیش فرض Django
Django به صورت پیش فرض چند Middleware مهم دارد.
نمونهای از آنها:
MIDDLEWARE = [
'django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
]
هر کدام وظیفه مشخصی دارند.
SessionMiddleware چه کاری انجام میدهد؟
این Middleware مدیریت Sessionها را بر عهده دارد.
وقتی کاربر وارد سایت میشود:
request.session
از طریق SessionMiddleware در دسترس قرار میگیرد.
بدون این Middleware سیستم Session کار نخواهد کرد.
AuthenticationMiddleware چه کاربردی دارد؟
این Middleware اطلاعات کاربر لاگین شده را به درخواست اضافه میکند.
مثلا:
request.user
اگر AuthenticationMiddleware فعال نباشد، Django نمیتواند کاربر فعلی را شناسایی کند.
CsrfViewMiddleware چه کاری انجام میدهد؟
این Middleware از حملات CSRF جلوگیری میکند.
وقتی فرم ارسال میشود:
{% csrf_token %}
CsrfViewMiddleware اعتبار Token را بررسی میکند.
اگر Token معتبر نباشد، درخواست رد میشود.
SecurityMiddleware چه کاربردی دارد؟
این Middleware مسئول بسیاری از تنظیمات امنیتی پروژه است.
از جمله:
- HSTS
- Redirect به HTTPS
- جلوگیری از بعضی حملات رایج
در اکثر پروژهها فعال نگه داشتن آن ضروری است.
Middleware سفارشی چیست؟
علاوه بر Middlewareهای آماده Django، میتوانید Middleware اختصاصی خودتان را نیز بنویسید.
مثلا برای:
- ثبت Log
- بررسی IP
- محدود کردن دسترسی
- تحلیل درخواستها
ساخت Middleware سفارشی
یک فایل جدید ایجاد کنید:
class RequestLoggerMiddleware:
def __init__(self, get_response):
self.get_response = get_response
def __call__(self, request):
print(request.path)
response = self.get_response(request)
return response
این Middleware مسیر تمام درخواستها را ثبت میکند.
فعال کردن Middleware
بعد از ساخت Middleware باید آن را داخل تنظیمات پروژه اضافه کنید:
MIDDLEWARE = [
...
'project.middleware.RequestLoggerMiddleware',
]
از این لحظه Middleware روی تمام درخواست ها اجرا می شود.
Middleware قبل از View
یکی از کاربردهای مهم Middleware اجرای عملیات قبل از رسیدن درخواست به View است.
مثلا:
def __call__(self, request):
print("Before View")
response = self.get_response(request)
return response
در این حالت قبل از اجرای View کد مورد نظر اجرا میشود.
Middleware بعد از View
همچنین میتوان بعد از تولید Response عملیات انجام داد.
مثلا:
response = self.get_response(request)
print("After View")
این بخش بعد از اجرای View اجرا میشود.
کاربردهای رایج Middleware در پروژههای واقعی
Middleware در پروژههای واقعی کاربردهای زیادی دارد.
از جمله:
- ثبت درخواست کاربران
- تحلیل رفتار کاربران
- محدود کردن IP
- جلوگیری از حملات
- مانیتورینگ سیستم
- ثبت زمان پاسخ سرور
- Rate Limiting
- مدیریت چند دامنه
بسیاری از این قابلیتها به صورت مرکزی و بدون تغییر Viewها پیاده سازی میشوند.
Middleware و Performance
هر Middleware روی تمام Requestها اجرا میشود.
بنابراین اگر Middleware سنگین باشد:
- زمان پاسخ بیشتر میشود
- CPU بیشتر مصرف میشود
- Performance افت میکند
به همین دلیل Middleware باید تا حد امکان سبک نوشته شود.
اشتباهات رایج هنگام استفاده از Middleware
اجرای Query سنگین
بعضی توسعه دهندهها داخل Middleware Queryهای سنگین اجرا میکنند.
مثلا:
User.objects.all()
از آنجا که Middleware برای تمام درخواستها اجرا میشود، این کار میتواند Performance پروژه را نابود کند.
استفاده از Middleware برای منطق نامرتبط
گاهی منطقهایی داخل Middleware قرار می گیرند که بهتر است در:
- View
- Service Layer
- Model
پیاده سازی شوند.
Middleware فقط برای منطق عمومی مناسب است.
ترتیب اشتباه Middlewareها
ترتیب Middlewareها اهمیت زیادی دارد.
مثلا:
SessionMiddleware
AuthenticationMiddleware
باید به همین ترتیب قرار بگیرند.
در غیر این صورت بعضی قابلیتها درست کار نمیکنند.
نوشتن Middleware بسیار پیچیده
Middleware نباید به محلی برای اجرای همه منطق پروژه تبدیل شود.
هر Middleware بهتر است فقط یک وظیفه مشخص داشته باشد.
چه زمانی باید از Middleware استفاده کنیم؟
Middleware زمانی انتخاب مناسبی است که منطق مورد نظر:
- روی تمام درخواستها اعمال شود
- مستقل از Viewها باشد
- نیاز به اجرای مرکزی داشته باشد
در غیر این صورت معمولا استفاده از View یا Decorator انتخاب بهتری است.
Middleware یا Decorator؟
بعضی توسعه دهندهها بین این دو انتخاب مردد هستند.
تفاوت اصلی:
- Middleware روی تمام درخواستها اجرا میشود
- Decorator فقط روی View مشخص اجرا میشود
اگر قابلیت فقط برای چند View لازم است، Decorator گزینه مناسبتری خواهد بود.
جمع بندی
Middleware در Django یکی از مهمترین بخشهای پردازش درخواست و پاسخ است. این لایه به شما اجازه میدهد عملیات عمومی مانند مدیریت Session، احراز هویت، امنیت، ثبت Log و کنترل دسترسی را در یک نقطه مرکزی مدیریت کنید. استفاده درست از Middleware باعث تمیزتر شدن کدها، سادهتر شدن نگهداری پروژه و افزایش انعطاف پذیری معماری نرم افزار میشود.





