فصل ۱: شروع درست — معماری، ساختار پروژه و Custom User

جنگو چیست؛ معماری MTV و چرخه‌ی درخواست/پاسخ

جنگو دقیقاً چه کاری برای ما می‌کند؟

جنگو یک فریمورک وب «باتری‌دار» پایتون است: ORM برای کار با پایگاه داده، سیستم مسیریابی URL، موتور قالب، فرم و اعتبارسنجی، احراز هویت، پنل ادمین آماده، migration، کش، ارسال ایمیل و ده‌ها محافظ امنیتی پیش‌فرض (CSRF، XSS، SQL Injection، Clickjacking) همه در خود فریمورک هستند. به همین دلیل یک تیم کوچک می‌تواند در چند هفته سامانه‌ای بسازد که با فریمورک‌های مینیمال چند ماه طول می‌کشد. اینستاگرام، Disqus و بسیاری از سامانه‌های اداری و فروشگاهی ایرانی روی جنگو ساخته شده‌اند.

MTV در برابر MVC

جنگو اسم لایه‌ها را کمی متفاوت گذاشته است و همین برای تازه‌کارها گیج‌کننده است:

جنگو (MTV)معادل در MVCمسئولیت
ModelModelساختار داده و منطق کسب‌وکار؛ هر کلاس یک جدول
TemplateViewنمایش؛ HTML با زبان قالب جنگو
ViewControllerگرفتن درخواست، خواندن/نوشتن داده، انتخاب پاسخ
URLconfRouterنگاشت آدرس به View

سفر یک درخواست

وقتی کاربر آدرس /orders/42/ را باز می‌کند، این اتفاق‌ها به ترتیب می‌افتد:

  1. وب‌سرور (nginx) درخواست را به سرور برنامه (gunicorn برای WSGI یا uvicorn برای ASGI) می‌دهد.
  2. جنگو یک شیء HttpRequest می‌سازد و آن را از لایه‌های Middleware به ترتیب تعریف‌شده در settings عبور می‌دهد (Session، Authentication، CSRF و…).
  3. URL Resolver فهرست urlpatterns را از بالا به پایین می‌گردد و اولین الگوی منطبق را پیدا می‌کند.
  4. View اجرا می‌شود؛ معمولاً از ORM داده می‌خواند و با یک Template پاسخ HTML می‌سازد.
  5. HttpResponse دوباره از Middlewareها — این بار به ترتیب برعکس — برمی‌گردد و به کاربر فرستاده می‌شود.
# apps/orders/views.py
from django.shortcuts import get_object_or_404, render
from .models import Order

def order_detail(request, pk):
    order = get_object_or_404(Order, pk=pk)          # Model
    return render(request, "orders/detail.html",      # Template
                  {"order": order})                   # View = هماهنگ‌کننده

# apps/orders/urls.py
from django.urls import path
from . import views

app_name = "orders"
urlpatterns = [
    path("<int:pk>/", views.order_detail, name="detail"),
]

کدام نسخه؟

در این دوره Django 5.x را هدف گرفته‌ایم و برای پروژه‌ی تازه نسخه‌ی 5.2 LTS را پیشنهاد می‌کنیم؛ نسخه‌های LTS حدود سه سال وصله‌ی امنیتی می‌گیرند. Django 5.x به Python 3.10 به بالا نیاز دارد و ما با Python 3.12 کار می‌کنیم.

نکته‌هایی که کمتر کسی می‌داند

  • داخل هر View می‌توانید request.resolver_match را بخوانید؛ نام url، namespace و آرگومان‌های گرفته‌شده را دارد و برای لاگ و منوی فعال عالی است.
  • ترتیب MIDDLEWARE مهم است: SecurityMiddleware باید اول باشد و AuthenticationMiddleware حتماً بعد از SessionMiddleware، چون کاربر را از Session می‌خواند.
  • اگر یک Middleware در مرحله‌ی درخواست خودش پاسخ برگرداند (مثلاً صفحه‌ی تعمیرات)، View و Middlewareهای بعدی اصلاً اجرا نمی‌شوند.
  • python -m django --version نسخه‌ی دقیق نصب‌شده در همان venv فعال را نشان می‌دهد؛ اولین قدم در عیب‌یابی خطاهای «این ویژگی وجود ندارد».
  • جنگو هم WSGI و هم ASGI را پشتیبانی می‌کند؛ فایل‌های wsgi.py و asgi.py هر دو در پروژه ساخته می‌شوند و View همگام شما در هر دو کار می‌کند.

برای ذخیره‌ی پیشرفت و شرکت در آزمون، وارد شوید — رایگان است.