آنچه در این مبحث می خوانید
الگوی معماری چیست؟
الگوی معماری (Architectural Pattern) در مهندسی نرمافزار، یک راهحل سطح بالا و ساختاریافته برای مسائل رایج در طراحی سیستمهای نرمافزاری است. این الگوها مجموعهای از اصول، اجزا و روابطی را تعریف میکنند که نحوه سازماندهی کد و تعامل بخشهای مختلف یک برنامه را مشخص میسازند. هدف اصلی استفاده از الگوهای معماری، افزایش خوانایی، قابلیت نگهداری، انعطافپذیری و مقیاسپذیری نرمافزار است. این الگوها مرزهای مشخصی بین وظایف مختلف سیستم ایجاد میکنند، که این امر از درهمتنیدگی (Tight Coupling) کد جلوگیری کرده و امکان کار موازی تیمهای توسعهدهنده را فراهم میآورد.
مدل MVC چیست؟
مدل-نما-کنترلکننده (Model-View-Controller یا MVC) یکی از شناختهشدهترین و تأثیرگذارترین الگوهای معماری است که بهطور گسترده در توسعه برنامههای کاربردی، بهویژه رابطهای کاربری گرافیکی و برنامههای وب، استفاده میشود. این الگو سیستم را به سه جزء اصلی تقسیم میکند:
- مدل (Model): این بخش مسئول مدیریت دادهها و منطق کسبوکار (Business Logic) برنامه است. مدل با پایگاه داده تعامل دارد، دادهها را بازیابی، ذخیره و اعتبارسنجی میکند. مدل از نحوه نمایش دادهها به کاربر هیچ اطلاعی ندارد.
- نما (View): نما مسئول ارائه دادههای مدل به کاربر است؛ یعنی همان رابط کاربری (UI). نما وظیفه نمایش بصری دادهها را بر عهده دارد و بهطور مستقیم با مدل ارتباط برقرار کرده و از آن دادهها را دریافت میکند.
- کنترلکننده (Controller): کنترلکننده بهعنوان واسطه بین مدل و نما عمل میکند. ورودیهای کاربر (مانند کلیکها یا درخواستهای HTTP) را دریافت کرده، آنها را تفسیر میکند و بر اساس نیاز، مدل را برای بهروزرسانی دادهها فراخوانی کرده یا نما را برای نمایش نتایج جدید انتخاب میکند.
آموزش شروع پروژه جنگو
چارچوب جنگو ساختار پروژههای خود را بر اساس یک مدل معماری خاص پیادهسازی میکند. قبل از ساخت پروژه، نیاز است که محیط پایتون و محیط مجازی شما آماده باشد.
دستور شروع پروژه (Start Project)
پس از نصب، برای ایجاد ساختار اصلی پروژه، از دستور django-admin startproject استفاده میشود. این دستور یک پروژه کامل با تنظیمات اولیه لازم ایجاد میکند.
فرض کنید میخواهیم پروژهای با نام my_site بسازیم:
django-admin startproject my_site
این دستور یک دایرکتوری به نام my_site در مسیر فعلی شما ایجاد میکند که حاوی فایلها و زیرپوشههای اولیه پروژه است.
فایلهای که دستور استارت پروژه میسازد
دستور startproject ساختار ابتدایی پروژه وب شما را ایجاد میکند که شامل چند جزء حیاتی است:
- پوشه اصلی پروژه (مثلاً
my_site/): این پوشه اصلی حاوی تنظیمات کل پروژه است.
settings.py: مهمترین فایل تنظیمات پروژه است. تمام پیکربندیها، از جمله تنظیمات پایگاه داده، لیست اپلیکیشنهای نصب شده، تنظیمات امنیتی (مانند کلید مخفی)، و مسیرهای فایلهای استاتیک در این فایل انجام میشود.urls.py: این فایل مسیردهنده اصلی (Root URLconf) پروژه است. تمامی درخواستهای ورودی (URLها) ابتدا در اینجا بررسی میشوند و بر اساس الگوها، به مسیردهیهای اپلیکیشنهای داخلی هدایت میگردند.wsgi.py: یک نقطه ورود برای سرورهای سازگار با WSGI (Web Server Gateway Interface) است که به سرورهای تولید (مانند Gunicorn یا uWSGI) کمک میکند تا با پروژه جنگو ارتباط برقرار کنند.asgi.py: مشابه WSGI، اما برای سرورهای سازگار با ASGI (Asynchronous Server Gateway Interface) است که برای قابلیتهای ناهمزمان (Async) مانند وبسوکتها ضروری است.
- فایل
manage.py: این یک اسکریپت خط فرمان است که به شما امکان میدهد با پروژه تعامل داشته باشید. دستوراتی مانند اجرای سرور توسعه (runserver)، اجرای مهاجرتها (migrate)، و ساخت اپلیکیشنهای جدید (startapp) از طریق این فایل اجرا میشوند.
آموزش ساخت APP در جنگو
یکی از اصول کلیدی جنگو، تفکیک وظایف به ماژولهای مستقل به نام اپلیکیشن (App) است. اپلیکیشنها در جنگو، ماژولهای قابل استفاده مجدد (Reusable Components) هستند که وظیفه مشخصی را انجام میدهند (مثلاً یک اپلیکیشن برای کاربران، یک اپلیکیشن برای وبلاگ، و غیره).
برای ساخت یک اپلیکیشن جدید درون پروژه، باید از فایل manage.py استفاده کنید. فرض کنید میخواهیم اپلیکیشنی با نام blog بسازیم:
python manage.py startapp blog
نکته حیاتی: پس از ساخت هر اپلیکیشن، باید نام آن را به لیست INSTALLED_APPS در فایل settings.py پروژه اصلی اضافه کنید تا جنگو از وجود آن آگاه شود.
فایلهایی که با دستور استارت اپ ساخته میشود
دستور startapp ساختار داخلی لازم برای یک ماژول مستقل را ایجاد میکند. این ساختار شامل فایلهای زیر است:
__init__.py: نشان میدهد که این پوشه یک پکیج پایتون است.admin.py: فایلی است که برای ثبت مدلهای این اپلیکیشن در پنل مدیریت جنگو (Django Admin) استفاده میشود.models.py: جایی است که شما کلاسهای مدل دادهای (تعریف ساختار پایگاه داده) این اپلیکیشن را تعریف میکنید.views.py: محلی است که توابع یا کلاسهای نما (View) که منطق پردازش درخواستها و بازگرداندن پاسخ را در خود جای دادهاند، تعریف میشوند.tests.py: برای نوشتن تستهای واحد (Unit Tests) جهت اطمینان از صحت عملکرد اپلیکیشن استفاده میشود.apps.py: حاوی کلاس پیکربندی اپلیکیشن است.
آموزش مدل معماری جنگو MTV
جنگو از یک الگوی معماری مشتق شده از MVC به نام مدل-قالب-نما (Model-Template-View یا MTV) پیروی میکند. این تغییر نام به دلیل تفاوت جزئی در تعاریف اجزا و نحوه تعامل آنها در چارچوب وب جنگو است:
- مدل (Model): این جزء دقیقاً مشابه MVC است؛ مسئولیت مدیریت دادهها، منطق کسبوکار و تعامل با پایگاه داده را بر عهده دارد.
- نما (View): در جنگو، نما (View) نقش کنترلکننده (Controller) در MVC را ایفا میکند. نما درخواست HTTP را دریافت میکند، با مدل تعامل میکند تا دادههای لازم را بهدست آورد، و سپس تصمیم میگیرد که کدام قالب (Template) باید برای نمایش نتایج استفاده شود.
- قالب (Template): این جزء نقش نما (View) در MVC را ایفا میکند. قالبها مسئول نمایش بصری دادهها هستند و صرفاً محتوای HTML را با دادههای دریافتی از View پر میکنند.
تفاوت مدل MVC و MTV
تفاوت اصلی بین MVC و MTV در نقش و نامگذاری دو جزء اصلی است:
| ویژگی | مدل MVC (رایج در فریمورکهایی مانند Spring/Rails) | مدل MTV جنگو (Django) |
|---|---|---|
| کنترلکننده (Controller) | مسئول دریافت ورودی و هدایت جریان برنامه. | این نقش توسط View در جنگو ایفا میشود. |
| نما (View) | مسئول نمایش بصری دادهها به کاربر (رابط کاربری). | این نقش توسط Template در جنگو ایفا میشود. |
| جریان کار | ورودی →\rightarrow→ Controller →\rightarrow→ Model (بهروزرسانی) →\rightarrow→ View (نمایش) | درخواست HTTP →\rightarrow→ View (منطق) →\rightarrow→ Model (داده) →\rightarrow→ Template (نمایش) |
بهعبارت دیگر، جنگو وظیفه کنترلکنندگی را به View و وظیفه ارائه نهایی (Presentation) را به Template محول کرده است. این تفکیک به توسعهدهندگان جنگو اجازه میدهد تا منطق برنامه (View) را بهوضوح از نمایش آن (Template) جدا سازند، در حالی که اصول بنیادی جداسازی نگرانیها (Separation of Concerns) حفظ میشود. در نهایت، جنگو یک معماری مبتنی بر مدل است که بهطور مؤثر وظایف سنتی MVC را در بافت یک چارچوب وب مدرن بازتوزیع کرده است.