آنچه در این مبحث می خوانید
چارچوب جنگو (Django) با معماری قدرتمند خود، فرآیند پیچیده تبدیل یک درخواست HTTP دریافتی از کاربر به یک پاسخ HTML یا دادهای مناسب را بهصورت یک خط لوله سازماندهی شده مدیریت میکند. درک ترتیب و نحوه تعامل اجزای مختلف این چرخه، برای دیباگ کردن، بهینهسازی عملکرد و توسعه ویژگیهای پیشرفته ضروری است. این مقاله به تفصیل اجزای اصلی دخیل در این چرخه، از سرور واسط گرفته تا اجزای داخلی جنگو، را شرح میدهد.
WSGI چیست؟
واسط دروازه وب سرور (WSGI – Web Server Gateway Interface) یک استاندارد رسمی در پایتون است که نحوه تعامل وب سرورهای پایتونی (مانند Gunicorn، uWSGI یا حتی سرور توسعهدهنده داخلی جنگو) با فریمورکهای وب پایتونی (مانند جنگو یا Flask) را تعریف میکند. WSGI یک لایه انتزاعی ایجاد میکند که به وب سرور اجازه میدهد درخواستها را به فرمت استاندارد تبدیل کرده و به برنامه جنگو ارسال کند، و سپس پاسخ دریافتی را به فرمت HTTP مناسب برگرداند. بهطور خلاصه، WSGI پلی است که یک وب سرور استاندارد (که با پروتکلهای سطح پایینتری کار میکند) را به برنامه جنگوی شما متصل میسازد تا بتواند درخواستهای HTTP را دریافت و پردازش کند.
Middlewares چیست؟
میانافزارها (Middlewares) بلوکهای نرمافزاری کوچکی هستند که جنگو پیش و پس از پردازش اصلی توسط View، آنها را بهصورت زنجیرهای فعال میکند. آنها دسترسی و قابلیت دستکاری درخواستها و پاسخها را در نقاط خاصی از چرخه حیات فراهم میکنند. یک Middleware میتواند وظایفی مانند: احراز هویت (Authentication)، مدیریت نشستها (Sessions)، فشردهسازی پاسخ، افزودن هدرهای امنیتی، یا رسیدگی به خطاهای جهانی را انجام دهد. جنگو دارای مجموعهای از میانافزارهای پیشفرض است که در فایل settings.py در لیست MIDDLEWARE تعریف میشوند و ترتیب اجرای آنها بسیار حیاتی است (مثلاً Middleware امنیتی باید زودتر از Middleware کش اجرا شود).
Url Router چیست؟ (URL Dispatcher)
مسیریاب URL (URL Router) که در فایل urls.py پروژه تعریف میشود، مغز متفکر جنگو برای هدایت درخواستها است. وقتی یک درخواست به سرور میرسد و از لایههای WSGI و Middleware عبور میکند، به مرحله مسیریابی میرسد. URL Router درخواست ورودی (مسیر URL) را با لیستی از الگوهای تعریف شده مقایسه میکند. هنگامی که یک تطابق پیدا میشود، Router این درخواست را به تابع View متناظر با آن الگو ارجاع میدهد. این کامپوننت وظیفه نگاشت آدرسهای خوانا (مانند /articles/my-post/) به کد اجرایی خاص در جنگو را بر عهده دارد.
ORM چیست؟ (Object-Relational Mapper)
نگاشت شیء-رابطهای (ORM) یکی از قویترین ویژگیهای جنگو است. ORM یک لایه انتزاعی فراهم میکند که به توسعهدهنده اجازه میدهد با پایگاه داده از طریق اشیاء و متدهای پایتون کار کند، بدون اینکه نیاز به نوشتن مستقیم کدهای SQL داشته باشد. برای مثال، بهجای نوشتن SELECT * FROM table WHERE id=5;، شما میتوانید از متد MyModel.objects.get(id=5) استفاده کنید. ORM مسئول ترجمه این فراخوانیهای شیءگرا به کوئریهای SQL صحیح برای دیتابیس بکاند (مانند PostgreSQL یا MySQL) و سپس ترجمه نتایج (مجموعه ردیفها) به اشیاء پایتون (Model Instances) است.
Context Processors چیست؟
پردازشگرهای زمینه (Context Processors) توابع خاصی هستند که جنگو قبل از رندر کردن هر قالبی (Template)، آنها را فراخوانی میکند. وظیفه آنها تزریق متغیرهای مشترک و از پیش تعیینشده به “زمینه (Context)” است که بعداً در تمام قالبهای پروژه قابل دسترسی خواهند بود. متداولترین کاربرد آنها، افزودن اطلاعات مربوط به کاربر لاگین شده، تنظیمات سایت، یا لینکهای ناوبری ثابت به تمام صفحات است. این امر از تکرار کد در هر View برای ارسال متغیرهای مشترک جلوگیری میکند.
Template Tag چیست؟
زبان قالب جنگو (Django Template Language – DTL) سیستمی برای جدا کردن منطق برنامه از ارائه (Presentation) است. تگهای قالب (Template Tags) بخشی از DTL هستند که به توسعهدهنده اجازه میدهند عملیات پویا و منطقی مانند حلقهها ({% for %}), شرطها ({% if %}) و فراخوانی توابع را مستقیماً درون فایلهای HTML اجرا کنند. آنها به توسعهدهنده اجازه میدهند تا دادههای دریافتی از View (که توسط ORM فراهم شدهاند) را در ساختار HTML نمایش دهند، بدون اینکه منطق پایتون مستقیماً در لایه نمایش دخالت کند.
مفهوم لاگ چیست؟ (Logging)
سیستم لاگبرداری (Logging) در جنگو برای ثبت رویدادهای مهم، خطاها، هشدارها و اطلاعات مربوط به اجرای برنامه در محیطهای توسعه و تولید استفاده میشود. این یک ابزار حیاتی برای نظارت بر سلامت برنامه و عیبیابی است. جنگو یک سیستم لاگبرداری استاندارد پایتون را با پیکربندیهای پیشفرض خود ادغام میکند. شما میتوانید لاگها را به فایلها، دیتابیس، یا حتی ایمیل هدایت کنید. این سیستم به توسعهدهندگان کمک میکند تا ببینند چه زمانی یک خطا رخ داده، در کدام لایه و با چه پارامترهایی.
نحوه ارتباط تمام موارد گفته شده (The Full Cycle)
چرخه حیات درخواست در جنگو یک فرآیند چندمرحلهای و خطی است:
- درخواست اولیه (HTTP Request): کاربر درخواستی را به آدرس سرور ارسال میکند.
- ورود به سرور واسط (WSGI): وب سرور (مانند Gunicorn) درخواست را دریافت کرده و با استفاده از استاندارد WSGI آن را به یک شیء درخواست (Request Object) استاندارد برای جنگو تبدیل میکند.
- عبور از میانافزارها (Middlewares – مرحله درخواست): شیء درخواست از زنجیره Middlewares عبور میکند. در این مرحله، عملیاتی مانند بررسی کوکیها، مدیریت نشستها و کنترلهای امنیتی انجام میشود.
- مسیریابی (URL Router): درخواست وارد URL Router (فایل
urls.py) میشود. Router مسیر درخواست را با الگوهای تعریف شده مطابقت داده و آن را به تابع View مرتبط هدایت میکند. - پردازش View: تابع View اجرا میشود. این تابع معمولاً منطق کسبوکار را اجرا میکند. اگر نیاز به داده باشد، View از ORM استفاده کرده و کوئریهای لازم را به پایگاه داده ارسال میکند. نتایج (اشیاء مدل) به View بازمیگردند.
- آمادهسازی زمینه قالب: اگر View قصد بازگرداندن یک صفحه HTML را داشته باشد، یک دیکشنری “زمینه (Context)” ایجاد میشود. Context Processors فراخوانی شده و متغیرهای مشترک به این زمینه اضافه میشوند.
- رندرینگ قالب (Template Rendering): View از موتور قالب جنگو برای ترکیب زمینه با فایل قالب (Template) استفاده میکند. در طول این فرآیند، Template Tags برای نمایش پویا دادهها و اجرای منطق ساده در HTML فعال میشوند.
- تولید پاسخ (HTTP Response): نتیجه نهایی یک شیء پاسخ (Response Object) است که حاوی محتوای نهایی HTML و سرآیندهای لازم است.
- عبور از میانافزارها (Middlewares – مرحله پاسخ): شیء پاسخ به عقب، از میان Middlewares عبور میکند. در اینجا، عملیاتی مانند فشردهسازی، افزودن هدرهای امنیتی نهایی یا انجام عملیات کش انجام میشود. در هر مرحله، Logging میتواند برای ثبت وضعیت اجرا استفاده شود.
- خروج (WSGI به وب سرور): در نهایت، WSGI پاسخ نهایی را به وب سرور بازمیگرداند تا آن را در قالب یک پیام HTTP استاندارد به مرورگر کاربر ارسال کند.