Middleware در Django لایه‌ای بین درخواست کاربر و پاسخ سرور است که به شما اجازه می‌دهد قبل از رسیدن درخواست به View یا قبل از ارسال پاسخ به کاربر، پردازش‌های مختلفی انجام دهید. بسیاری از قابلیت‌های مهم Django مانند مدیریت Session، احراز هویت کاربران، امنیت و مدیریت پیام‌ها از طریق Middleware پیاده سازی شده‌اند و بدون آن بخش بزرگی از امکانات فریم ورک از کار می‌افتد.

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 باعث تمیزتر شدن کدها، ساده‌تر شدن نگهداری پروژه و افزایش انعطاف پذیری معماری نرم افزار می‌شود.