توی این اپیزود مرور کوتاهی داریم بر جنگو و معماری MVT و همچنین ویژگی های جدید جنگو ۵ رو بررسی میکنیم.

جنگو یک فریمورک است که از مجموعهای از مؤلفهها تشکیل شده و مشکلات رایج توسعهی وب را حل میکند.
مؤلفههای جنگو بهصورت loosely coupled (یعنی با اتصال ضعیف به یکدیگر) طراحی شدهاند، به این معنا که هر کدام میتوانند بهطور مستقل مدیریت شوند. این ویژگی کمک میکند وظایف لایههای مختلف فریمورک از هم جدا باشند؛ بهعنوان مثال، لایهی پایگاه داده هیچ اطلاعی از نحوهی نمایش دادهها ندارد، سیستم قالببندی (template system) هیچ شناختی از درخواستهای وب ندارد، و به همین ترتیب سایر بخشها نیز مستقل هستند.
جنگو با پیروی از اصل DRY (don’t repeat yourself / خودت را تکرار نکن)، حداکثر قابلیت استفاده مجدد از کد را فراهم میکند.
جنگو به توسعه سریع برنامهها کمک میکند و با استفاده از قابلیتهای پویای پایتون، مانند introspection، این امکان را میدهد که با کدنویسی کمتر کارهای بیشتری انجام دهید.
همنچنین شما میتوانید درمورد فلسفه های جنگو بخوانید.
https://docs.djangoproject.com/en/5.0/misc/design-philosophies/
نکته: دقت کنید که لینک بالا، در نسخهٔ فعلی جنگو هشدار میدهد که این نسخه از جنگو دیگر پشتیبانی نمیشود و بهتر است به نسخهٔ جدیدتر ارتقا داده شود. اما چون در متن کتاب بود و هدف ترجمه این کتاب هست حذفش نکردم.
جنگو از الگوی MTV (Model‑Template‑View) پیروی میکند. این الگو تا حدی شبیه الگوی شناختهشدهٔ MVC (Model‑View‑Controller) است؛ با این تفاوت که در جنگو Template نقش View را دارد و خود فریمورک نقش Controller را ایفا میکند.
در الگوی MTV جنگو، مسئولیتها به شکل زیر تقسیم میشوند:
Model: ساختار منطقی دادهها را تعریف میکند و بهعنوان واسطهٔ مدیریت دادهها بین پایگاه داده و View عمل میکند.
Template: لایهٔ نمایش (presentation layer) است. جنگو از یک سیستم قالب مبتنی بر متن ساده استفاده میکند که هر چیزی را که در مرورگر نمایش داده میشود مدیریت میکند.
View: از طریق Model با پایگاه داده ارتباط برقرار میکند و دادهها را برای نمایش به Template ارسال میکند.
خود فریمورک نقش Controller را دارد. فریمورک بر اساس تنظیمات URL در جنگو، درخواست را به View مناسب ارسال میکند.
هنگام توسعهٔ هر پروژهٔ جنگو، همیشه با مدلها، ویوها، تمپلیتها و URLها کار خواهید کرد. در این فصل یاد میگیرید که این بخشها چگونه در کنار یکدیگر قرار میگیرند.
شکل زیر نشان میدهد که جنگو چگونه درخواستها را پردازش میکند و چرخهٔ درخواست/پاسخ (request/response cycle) چگونه با استفاده از اجزای اصلی جنگو—یعنی URLها، ویوها، مدلها و تمپلیتها—مدیریت میشود.

فرآیند مدیریت درخواستهای HTTP و تولید پاسخ در جنگو به این صورت انجام میشود:
یک مرورگر وب با استفاده از یک URL صفحهای را درخواست میکند و وبسرور این درخواست HTTP را به جنگو ارسال میکند.
جنگو الگوهای URL پیکربندیشده را بررسی میکند و وقتی به اولین الگویی برسد که با URL درخواستی مطابقت دارد، متوقف میشود.
جنگو View مربوط به آن الگوی URL را اجرا میکند.
View در صورت نیاز از مدلهای داده (Models) برای دریافت اطلاعات از پایگاه داده استفاده میکند.
مدلهای داده ساختار دادهها و رفتار آنها را تعریف میکنند و برای پرسوجو(Query) از پایگاه داده به کار میروند.
View یک Template (معمولاً HTML) را برای نمایش دادهها پردازش (Render) میکند و آن را در قالب یک پاسخ HTTP برمیگرداند.
در پایان این فصل و در بخش چرخهٔ درخواست/پاسخ (The request/response cycle) دوباره به این فرآیند بازخواهیم گشت.
همچنین جنگو در فرایند درخواست/پاسخ نقاط اتصالی دارد که میانافزار(Middleware) نام دارد. اما برای ساده بودن نمودار بالا، بطور موقت حذف شده و در فصول بعدی بطور کامل به آن میپردازیم.(به فصل ۱۷ مراجعه کنید)
تا اینجا عناصر پایهای جنگو و نحوه پردازش درخواستها توسط آن را بررسی کردهایم. اکنون بیایید ویژگیهای جدید معرفیشده در Django 5 را بررسی کنیم.
جنگو ۵ چندین قابلیت مهم جدید معرفی میکند که در مثالهای این کتاب از آنها استفاده خواهید کرد.
این نسخه همچنین برخی قابلیتها را منسوخ (deprecated) اعلام کرده و بعضی از قابلیتهایی را که قبلاً منسوخ شده بودند، بهطور کامل حذف کرده است.
ویژگیهای جدید و مهم Django 5.0:
فیلترهای Facet در پنل مدیریت:
اکنون میتوان فیلترهای Facet را به بخش مدیریت جنگو اضافه کرد. وقتی این قابلیت فعال باشد، برای فیلترهایی که در لیست اشیای Admin اعمال شدهاند، تعداد نتایج هر فیلتر نیز نمایش داده میشود. این قابلیت در بخش Added facet counts to filters همین فصل توضیح داده شده است.
سادهتر شدن قالبهای رندر فیلدهای فرم:
رندر کردن فیلدهای فرم سادهتر شده است. اکنون میتوان گروههایی از فیلدها (field groups) را تعریف کرد که هرکدام قالب (template) مخصوص خود را دارند. این کار باعث میشود اجزای مرتبط با یک فیلد فرم مانند label، widget، متن راهنما (help text) و خطاها راحتتر و منظمتر نمایش داده شوند. نمونهای از استفاده از field groups در بخش Creating templates for the comment form در فصل ۲ کتاب آورده شده است.
مقادیر پیشفرض محاسبهشده در دیتابیس:
جنگو اکنون از مقادیر پیشفرضی پشتیبانی میکند که توسط خود دیتابیس محاسبه میشوند. نمونهای از این قابلیت در بخش Adding datetime fields همین فصل ارائه شده است.
فیلدهای مدل که توسط دیتابیس تولید میشوند:
یک نوع جدید از فیلدها معرفی شده است که به شما اجازه میدهد ستونهایی در دیتابیس داشته باشید که مقدارشان بهصورت خودکار توسط دیتابیس تولید میشود. مقدار این فیلدها با استفاده از یک عبارت(expression) تعیین میشود و هر بار که مدل تغییر کند، مقدار آن بر اساس همان عبارت دوباره محاسبه میشود. این کار با استفاده از دستورات SQL به نام GENERATED ALWAYS انجام میشود.
گزینههای بیشتر برای تعریف choices در فیلدهای مدل:
در فیلدهایی که از choices پشتیبانی میکنند، دیگر لازم نیست برای دسترسی به enumها از ویژگی choices. استفاده کنید. اکنون میتوان بهجای یک iterable، مستقیماً از mapping یا callable استفاده کرد تا enumها گسترش داده شوند. مثال این تغییر در بخش Adding a status field همین فصل آمده است.
جنگو ۵ همچنین چند بهبود در زمینه پشتیبانی از پردازش ناهمزمان (asynchronous) ارائه کرده است.
پشتیبانی از ASGI (Asynchronous Server Gateway Interface) اولین بار در Django 3 معرفی شد و در Django 4.1 بهبود پیدا کرد؛ در آن نسخه قابلیتهایی مثل هندلرهای async برای viewهای مبتنی بر کلاس (Class-Based Views) و همچنین رابط ORM بهصورت asynchronous اضافه شدند.
در Django 5 نیز پیشرفتهای جدیدی اضافه شده است:
اضافه شدن توابع async به سیستم احراز هویت جنگو (authentication framework)
پشتیبانی از ارسال سیگنالها بهصورت asynchronous
اضافه شدن پشتیبانی async به چندین decorator داخلی جنگو
بهطور خلاصه، جنگو در هر نسخه بیشتر به سمت پشتیبانی کامل از معماری async پیش میرود تا بتواند بهتر با WebSocketها، درخواستهای همزمان زیاد، و سیستمهای real‑time کار کند.
نکته: جنگو ۵.۰ دیگر از پایتون در نسخه های 3.8 و 3.9 پشتیبانی نمیکند.
لیست تمامی تغییرات و ویژگیهای جنگو ۵.۰ را میتوانید از این لینک بخوانید:
https://docs.djangoproject.com/en/5.0/releases/5.0
از آنجا که انتشار Django بر اساس زمانبندی انجام میشود در نسخه ۵ تغییرات اساسی و بزرگی وجود ندارد. به همین دلیل ارتقای پروژههایی که با Django 4 ساخته شدهاند به Django 5.0 معمولاً ساده و مستقیم است.
اگر بخواهید یک پروژهی موجود Django را سریع به نسخه 5.0 ارتقا دهید، میتوانید از ابزار django-upgrade استفاده کنید. این پکیج فایلهای پروژهی شما را بررسی کرده و با اعمال مجموعهای از fixerها (اصلاحات خودکار کد) آنها را به نسخهی هدف بازنویسی میکند.
طریقه استفاده از django-upgrade را میتوانید در صفحه مستندات رسمی مطالعه کنید:
https://github.com/adamchainz/django-upgrade
ابزار django-upgrade با الهام از پکیجی به نام pyupgrade ساخته شده است.
با استفاده از pyupgrade میتوانید بهصورت خودکار ساختارهای قدیمی کد پایتون را به سینتکس نسخههای جدیدتر پایتون ارتقا دهید.
برای کسب اطلاعات بیشتر درمورد pyupgrade به صفحه مستندات با لینک زیر مراجعه کنید:
https://github.com/asottile/pyupgrade