
روز ۳۵: Middleware در جنگو چیست و چه کاربردی دارد
در جنگو، Middleware یکی از مفاهیم بسیار مهم و در عین حال کمتر درکشده برای برنامهنویسان تازهکار است. Middleware در واقع لایهای است که بین Request کاربر و Response سرور قرار میگیرد و به شما اجازه میدهد قبل یا بعد از پردازش درخواستها، منطق دلخواه خودتان را اجرا کنید. این قابلیت باعث میشود بدون دستکاری Viewها یا Templateها، رفتار کلی پروژه را کنترل و مدیریت کنید. Middleware نقش ستون فقرات بسیاری از قابلیتهای داخلی جنگو مثل احراز هویت، مدیریت سشنها و امنیت را ایفا میکند.
جایگاه Middleware در چرخه Request و Response
برای درک بهتر Middleware باید مسیر حرکت یک درخواست را بشناسیم. وقتی کاربر یک URL را در مرورگر باز میکند، درخواست ابتدا وارد جنگو میشود، سپس از میان Middlewareها عبور میکند، بعد به URLها و View مربوطه میرسد و در نهایت پاسخ تولید شده دوباره از میان Middlewareها عبور کرده و به کاربر بازگردانده میشود. این یعنی Middleware هم روی درخواست ورودی و هم روی پاسخ خروجی کنترل کامل دارد و همین موضوع آن را بسیار قدرتمند میکند.
Middleware چه مشکلاتی را حل میکند
در پروژههای واقعی معمولاً نیازهایی وجود دارد که نمیخواهیم آنها را در تمام Viewها تکرار کنیم. مثلاً بررسی لاگین بودن کاربر، ثبت لاگ از درخواستها، محدود کردن IPها یا افزودن Headerهای امنیتی. اگر این منطقها را در View بنویسیم، کدها تکراری و غیرقابل نگهداری میشوند. Middleware دقیقاً برای حل همین مشکل طراحی شده است و کمک میکند منطقهای سراسری پروژه را در یک نقطه متمرکز پیادهسازی کنیم.
Middlewareهای پیشفرض جنگو
جنگو به صورت پیشفرض مجموعهای از Middlewareهای بسیار مهم را در اختیار ما قرار میدهد. این Middlewareها مسئول بخشهای حیاتی مانند امنیت، مدیریت سشنها، احراز هویت کاربران و محافظت در برابر حملات CSRF هستند. اگر فایل settings.py را بررسی کنید، لیستی به نام MIDDLEWARE مشاهده میکنید که ترتیب اجرای Middlewareها را مشخص میکند. ترتیب این لیست بسیار مهم است و تغییر اشتباه آن میتواند باعث بروز خطاهای جدی در پروژه شود.
ساختار کلی یک Middleware در جنگو
ساخت Middleware در جنگو بسیار سادهتر از چیزی است که به نظر میرسد. یک Middleware در واقع یک کلاس پایتونی است که متد init و call را پیادهسازی میکند. این کلاس میتواند قبل از اجرای View و بعد از تولید Response کدهای دلخواه شما را اجرا کند. همین ساختار ساده باعث شده Middleware به یکی از منعطفترین ابزارهای جنگو تبدیل شود.
class SimpleMiddleware:
def __init__(self, get_response):
self.get_response = get_response
def __call__(self, request):
response = self.get_response(request)
return responseاین سادهترین شکل یک Middleware است که بدون تغییر رفتار پروژه، در چرخه درخواست و پاسخ قرار میگیرد.
اجرای کد قبل از View با Middleware
یکی از کاربردهای بسیار مهم Middleware اجرای کد قبل از رسیدن درخواست به View است. در این بخش میتوانید اطلاعات Request را بررسی کنید، دسترسیها را محدود کنید یا حتی درخواست را متوقف کنید. این قابلیت برای پیادهسازی سیستمهایی مثل محدودیت دسترسی بر اساس IP یا بررسی Headerهای خاص بسیار کاربردی است.
def __call__(self, request):
if not request.user.is_authenticated:
pass
response = self.get_response(request)
return responseدر این مثال میتوان قبل از اجرای View، وضعیت کاربر را بررسی کرد.
اجرای کد بعد از View با Middleware
Middleware فقط برای بررسی درخواستها نیست، بلکه میتواند روی پاسخ خروجی هم تأثیر بگذارد. مثلاً میتوانید Headerهای خاصی به Response اضافه کنید، زمان پاسخدهی را اندازهگیری کنید یا محتوای پاسخ را تغییر دهید. این قابلیت در پروژههای حرفهای برای بهینهسازی عملکرد و افزایش امنیت بسیار مهم است.
def __call__(self, request):
response = self.get_response(request)
response['X-Custom-Header'] = 'Django Middleware'
return responseاضافه کردن Headerهای امنیتی یکی از کاربردهای رایج این بخش است.
ثبت Middleware در settings.py
بعد از ساخت Middleware، برای فعال شدن آن باید مسیر کامل کلاس را در لیست MIDDLEWARE در فایل settings.py اضافه کنیم. این مرحله بسیار مهم است و اگر فراموش شود، Middleware شما هرگز اجرا نخواهد شد. ترتیب قرارگیری Middleware نیز اهمیت زیادی دارد و باید با دقت انتخاب شود.
MIDDLEWARE = [
'django.middleware.security.SecurityMiddleware',
'core.middleware.SimpleMiddleware',
]در این مثال، Middleware سفارشی بعد از Middleware امنیتی اجرا میشود.
مثال کاربردی: ثبت لاگ درخواستها
یکی از مثالهای کاربردی Middleware، ثبت لاگ از درخواستهای کاربران است. با این روش میتوان مسیرهای پرکاربرد، رفتار کاربران و حتی مشکلات احتمالی پروژه را بررسی کرد. این اطلاعات برای تحلیل و بهبود عملکرد سایت بسیار ارزشمند هستند و بدون Middleware پیادهسازی آنها سخت و پراکنده خواهد بود.
نکات مهم و اشتباهات رایج در استفاده از Middleware
Middleware ابزار قدرتمندی است اما استفاده نادرست از آن میتواند باعث کاهش شدید عملکرد پروژه شود. نباید منطقهای سنگین یا کوئریهای پیچیده را داخل Middleware اجرا کرد. همچنین Middleware نباید جایگزین View یا Permissionها شود، بلکه باید فقط برای منطقهای سراسری و عمومی استفاده شود. رعایت این نکات باعث میشود پروژه شما هم سریع باقی بماند و هم قابل نگهداری باشد.
جمعبندی روز سیوپنجم
در روز سیوپنجم یاد گرفتیم Middleware در جنگو چیست، چه جایگاهی در چرخه Request و Response دارد و چگونه میتوان از آن برای پیادهسازی منطقهای سراسری استفاده کرد. Middleware یکی از ابزارهای کلیدی جنگو برای پروژههای حرفهای است و تسلط بر آن نشاندهنده ورود شما به سطح پیشرفته توسعه وب با جنگو محسوب میشود.