ساختار Project و App در Django

در درس قبل با Django آشنا شدیم، محیط مجازی ساختیم، Django را نصب کردیم و اولین Project خودمان را ایجاد کردیم. در این درس می‌خواهیم یکی از مهم‌ترین مفاهیم Django را یاد بگیریم که تفاوت Project و App می‌باشد. این موضوع بسیار مهم است. چون از اینجا به بعد پروژه واقعی آزمون پلاس را مرحله‌ به‌ مرحله توسعه می‌دهیم و باید بدانیم هر قسمت از سایت را کجا قرار دهیم.

در پایان این درس، علاوه بر شناخت ساختار Project و App، اولین App واقعی پروژه سایت آموزش آنلاین آزمون پلاس را نیز ایجاد و به پروژه متصل می‌کنیم.

فهرست مطالب

منظور از Project در Django چیست؟

قبلا دیدیم که با دستور زیر Django یک Project ایجاد کرد:

django-admin startproject config .

Project را می‌توانیم به‌عنوان هسته اصلی و تنظیمات کلی سایت در نظر بگیریم. Project معمولاً شامل مواردی مانند موارد زیر می‌باشد:

  • تنظیمات اصلی سایت
  • URLهای اصلی
  • تنظیمات Database
  • تنظیمات Template
  • تنظیمات Static و Media
  • تنظیمات امنیتی
  • تنظیمات برنامه‌های مختلف سایت

در پروژه ما، Project اصلی فعلاً config نام دارد. بیایید ساختار آن را به یاد بیاوریم:

 
azmoonplus-django/
├── .venv/
├── config/
│ ├── __init__.py
│ ├── settings.py
│ ├── urls.py
│ ├── asgi.py
│ └── wsgi.py
└── manage.py

منظور از App در Django چیست؟

به بیان خیلی ساده App یک بخش یا قابلیت مشخص از پروژه است. یک سایت واقعی معمولاً از بخش‌های مختلفی تشکیل شده است. مثلاً سایت آموزش آنلاین آزمون پلاس را در نظر بگیریم. ما احتمالاً به بخش‌هایی مانند این‌ها نیاز خواهیم داشت:

کاربران
دوره‌ها
سفارش‌ها
پرداخت‌ها

هرکدام از این قابلیت‌ها می‌توانند در یک App جداگانه پیاده‌سازی شوند. مثلاً:

accounts
courses
orders
payments
بنابراین :

Project = کل سایت و تنظیمات اصلی آن
App = یک قابلیت یا بخش مشخص از سایت

چرا Appها را جدا می‌کنیم؟

ممکن است سوال کنید که چرا همه کدها را داخل یک App قرار ندهیم؟ پاسخ این است که با بزرگ شدن پروژه، مدیریت یک App بسیار بزرگ سخت خواهد شد. برای مثال فرض کنید همه این موارد را در یک App قرار دهیم:

کاربران
دوره‌ها
درس‌ها
سفارش‌ها
پرداخت‌ها
مدرس‌ها
پروفایل

بعد از مدتی فایل‌های پروژه بسیار بزرگ و پیچیده می‌شوند. اما اگر آن‌ها را به صورت منطقی جدا کنیم:

accounts
courses
orders
payments

هر App مسئولیت مشخصی خواهد داشت که باعث می‌شود:

  • کدها مرتب‌تر باشند.
  • توسعه پروژه راحت‌تر شود.
  • پیدا کردن کدها ساده‌تر شود.
  • خطایابی راحت‌تر شود.
  • قابلیت‌های مختلف از یکدیگر جدا باشند.
  • پروژه در آینده راحت‌تر توسعه پیدا کند.

ساخت اولین App پروژه

حالا می‌خواهیم از حالت تئوری خارج شویم و اولین App واقعی پروژه آزمون پلاس را بسازیم. در پروژه ما، اولین بخش مهم دوره‌های آموزشی است. بنابراین App مربوط به دوره‌ها را با نام:

courses

ایجاد می‌کنیم. برای این کار در Terminal و در همان پوشه‌ای که manage.py قرار دارد، اجرا کنید:

python manage.py startapp courses

بعد از اجرای دستور، ساختار پروژه به شکل زیر درمی‌آید:

ساختار App را بررسی کنیم

حالا فایل‌های داخل courses را یکی‌یکی بررسی می‌کنیم.

models.py

این فایل یکی از مهم‌ترین فایل‌های App است. Modelهای مربوط به این App را در این فایل تعریف می‌کنیم. مثلاً در App courses در آینده Modelهایی مانند این‌ها خواهیم داشت:

Course
Category
Lesson

در درس‌های مربوط به Model به‌صورت کامل آن را ایجاد خواهیم کرد.

views.py

در این فایل Viewهای مربوط به App را قرار می‌دهیم. View وظیفه دارد درخواست کاربر را پردازش کند. مثلاً در App courses ممکن است Viewهایی مانند این‌ها داشته باشیم:

course_list
course_detail
اولی لیست دوره‌ها را نمایش می‌دهد و دومی جزئیات یک دوره را. 

admin.py

این فایل برای تنظیم و مدیریت Django Admin مربوط به App استفاده می‌شود. بعداً وقتی Modelهای دوره را ایجاد کردیم، می‌توانیم آن‌ها را در Admin ثبت کنیم. بعد از این کار، مدیر سایت می‌تواند دوره‌ها را از طریق پنل مدیریت Django مدیریت کند. در درس مربوط به Admin، این بخش را کامل پیاده‌سازی خواهیم کرد.

apps.py

این فایل شامل تنظیمات مربوط به خود App است. وقتی Django App را ایجاد می‌کند، یک کلاس تنظیماتی برای آن ایجاد می‌شود. در حال حاضر لازم نیست چیزی در این فایل تغییر دهیم.

tests.py

این فایل برای نوشتن تست‌های خودکار App استفاده می‌شود. مثلاً در آینده می‌توانیم بررسی کنیم که:

  • آیا دوره به‌درستی ایجاد می‌شود؟
  • آیا قیمت دوره درست محاسبه می‌شود؟
  • آیا کاربر می‌تواند دوره خریداری‌شده را مشاهده کند؟

فعلاً تستی در این فایل نمی‌نویسیم، اما در پروژه‌های واقعی تست‌نویسی اهمیت زیادی دارد.

پوشه migrations

بعد از ساخت App، پوشه‌ای به نام migraions ایجاد می‌شود. این پوشه مربوط به Migrationهای Database است. وقتی Modelهای خودمان را تغییر می‌دهیم، Django می‌تواند این تغییرات را به Migration تبدیل کند. در درس مربوط به Model و Database این موضوع را کاملاً عملی انجام خواهیم داد.

 

__init__.py

این فایل در حال حاضر خالی است. وجود آن به Python کمک می‌کند تا پوشه courses را به‌عنوان یک Package پایتونی شناسایی کند. که فعلاً نیازی به تغییر آن نداریم.

اتصال App به Project

تا اینجا App را ساخته‌ایم؛ اما یک مرحله مهم باقی مانده است. Django هنوز نمی‌داند که App courses بخشی از پروژه ماست. پس باید آن را در تنظیمات Project ثبت کنیم. برای این منظور فایل زیر را باز کنید:

config/settings.py

قسمتی با نام:

INSTALLED_APPS

را پیدا کنید.

در حالت اولیه چیزی شبیه این است:

INSTALLED_APPS = [
‘django.contrib.admin’,
‘django.contrib.auth’,
‘django.contrib.contenttypes’,
‘django.contrib.sessions’,
‘django.contrib.messages’,
‘django.contrib.staticfiles’,
]

حالا App خودمان را اضافه می‌کنیم تا از این لحظه Django بداند که courses یکی از Appهای پروژه است:

چرا INSTALLED_APPS مهم است؟

INSTALLED_APPS فهرستی از Appهایی است که Django باید آن‌ها را در پروژه فعال و مدیریت کند. Django تعدادی App داخلی خودش را نیز به‌صورت پیش‌فرض در این قسمت قرار داده است. برای مثال: 

django.contrib.admin

مربوط به پنل مدیریت Django است. و:

django.contrib.auth

مربوط به سیستم Authentication و کاربران است. ما نیز Appهای خودمان را به این فهرست اضافه می‌کنیم. 

اولین View پروژه را ایجاد کنیم

حالا می‌خواهیم مطمئن شویم App ما واقعاً کار می‌کند. فایل:

courses/views.py

را باز کنید و کد موجود را به این شکل تغییر دهید:

from django.http import HttpResponse
 
 
def course_list(request):
return HttpResponse(“لیست دوره‌های آزمون پلاس”)
 

این View فعلاً فقط یک متن ساده برمی‌گرداند. اما یک مشکل داریم: هنوز هیچ URLای برای این View تعریف نکرده‌ایم. بنابراین کاربر نمی‌تواند به آن دسترسی پیدا کند. در اینجا با یکی از مفاهیم مهم Django یعنی URL Routing روبه‌رو می‌شویم.

ساخت urls.py برای App

بهتر است URLهای هر App را در خود همان App مدیریت کنیم. بنابراین داخل پوشه courses یک فایل جدید ایجاد کنید:

courses/urls.py

و داخل آن بنویسید:

from django.urls import path
from . import views
 
 
urlpatterns = [
path(, views.course_list, name=‘course_list’),
]

اینجا:

views.course_list

یعنی وقتی این URL درخواست شد، View مربوط به course_list اجرا شود.

اتصال URLهای App به Project

حالا باید URLهای courses را به URLهای اصلی Project متصل کنیم. فایل:

config/urls.py
را باز کنید. در ابتدا چیزی شبیه این داریم:
from django.contrib import admin
from django.urls import path
 
 
urlpatterns = [
path(‘admin/’, admin.site.urls),
]

آن را به شکل زیر تغییر دهید:

 

اینجا دقیقاً چه اتفاقی افتاد؟

بیایید کل مسیر را مرور کنیم. کاربر این آدرس را وارد می‌کند:

/courses/

Django ابتدا به config/urls.py مراجعه می‌کند. در آنجا داریم:

path(‘courses/’, include(‘courses.urls’))

بنابراین Django می‌گوید: “درخواست مربوط به /courses/ است؛ ادامه مسیر را در courses/urls.py بررسی کن.” سپس وارد این فایل می‌شود:

path(, views.course_list, name=‘course_list’)

بنابراین View زیر اجرا می‌شود:

def course_list(request):
return HttpResponse(“لیست دوره‌های آزمون پلاس”)

و Response به مرورگر برمی‌گردد. این اولین نمونه عملی از معماری Django است که در درس قبل درباره آن صحبت کردیم. الان اگر در نوار آدرس مرورگر بنویسید:

http://127.0.0.1:8000/courses/

با صفحه لیست دوره‌ها مواجه خواهید شد که انتظارش را داشتید:

ساختار فعلی پروژه

در پایان این بخش، ساختار پروژه ما تقریباً به شکل زیر است:

azmoonplus-django/
├── .venv/
├── config/
│ ├── __init__.py
│ ├── settings.py
│ ├── urls.py
│ ├── asgi.py
│ └── wsgi.py
├── courses/
│ ├── __init__.py
│ ├── admin.py
│ ├── apps.py
│ ├── models.py
│ ├── tests.py
│ ├── urls.py
│ ├── views.py
│ │
│ └── migrations/
│ └── __init__.py
└── manage.py

Migration چیست؟

در ساختار پروژه مشاهده می‌کنید که پوشه‌ای با نام migrations وجود دارد. migration در django مکانیزمی است که تغییرات مربوط به ساختار دیتابیس را مدیریت می‌کند. زمانی که در پروژه modelهایی ایجاد یا تغییر می‌دهیم، django می‌تواند این تغییرات را به migration تبدیل کند تا ساختار دیتابیس نیز مطابق مدل‌ها ایجاد یا به‌روزرسانی شود. فعلا فقط کافیست با مفهوم migration آشنا شوید. نحوه کار با makemigrations و migrate را در مبحث Model و Database به‌صورت کامل یاد خواهیم گرفت.

درس بعدی

در درس بعدی وارد URL Routing و Viewها به‌صورت عمیق‌تر می‌شویم و صفحات مختلف سایت را ایجاد می‌کنیم؛ از جمله صفحه لیست دوره‌ها و صفحه جزئیات یک دوره.

رفتن به درس بعدی

برای شرکت در آزمون آماده‌اید؟

با ورود به پنل کاربری می‌توانید جهت ثبت نام در آزمون‌ها و دسترسی به منابع آموزشی اقدام نمایید. کارشناسان ما در اسرع وقت با شما تماس می‌گیرند.

شروع کار با Django

شروع کار با Django در دوره آموزش جامع پایتون با مفاهیمی مانند متغیرها، شرط‌ها، حلقه‌ها، توابع، کلاس‌ها، فایل‌ها و کار

ادامه مطلب »

عملیات CRUD در SQLite

عملیات CRUD درSQLite در بخش قبل با مفهوم پایگاه داده، SQLite و نحوه اتصال پایتون به پایگاه داده آشنا شدیم.

ادامه مطلب »

توابع در پایتون

توابع در پایتون اگر هنگام برنامه‌نویسی مجبور شوید یک قطعه کد را بارها تکرار کنید، برنامه شما طولانی، شلوغ و

ادامه مطلب »

مجموعه در پایتون

مجموعه (Set) در پایتون به زبان ساده، Set مجموعه‌ای از عناصر منحصربه‌فرد (Unique) است که ترتیب مشخصی ندارد و اجازه

ادامه مطلب »

تاپل در پایتون

تاپل (Tuple) در پایتون بعد از آشنایی با لیست (List)، نوبت به یکی دیگر از ساختارهای داده در پایتون یعنی

ادامه مطلب »

لیست در پایتون

لیست (List) در پایتون پرکاربردترین ساختار داده​ تا اینجا یاد گرفتید که هر متغیر فقط یک مقدار را در خود

ادامه مطلب »

آموزش نصب پایتون

آموزش نصب پایتون و ابزارهای موردنیاز (راهنمای کامل برای ویندوز) اگر تصمیم گرفته‌اید برنامه‌نویسی را یاد بگیرید، احتمالاً نام زبان

ادامه مطلب »