جنگو دقیقاً چه کاری برای ما میکند؟
جنگو یک فریمورک وب «باتریدار» پایتون است: ORM برای کار با پایگاه داده، سیستم مسیریابی URL، موتور قالب، فرم و اعتبارسنجی، احراز هویت، پنل ادمین آماده، migration، کش، ارسال ایمیل و دهها محافظ امنیتی پیشفرض (CSRF، XSS، SQL Injection، Clickjacking) همه در خود فریمورک هستند. به همین دلیل یک تیم کوچک میتواند در چند هفته سامانهای بسازد که با فریمورکهای مینیمال چند ماه طول میکشد. اینستاگرام، Disqus و بسیاری از سامانههای اداری و فروشگاهی ایرانی روی جنگو ساخته شدهاند.
MTV در برابر MVC
جنگو اسم لایهها را کمی متفاوت گذاشته است و همین برای تازهکارها گیجکننده است:
| جنگو (MTV) | معادل در MVC | مسئولیت |
|---|---|---|
| Model | Model | ساختار داده و منطق کسبوکار؛ هر کلاس یک جدول |
| Template | View | نمایش؛ HTML با زبان قالب جنگو |
| View | Controller | گرفتن درخواست، خواندن/نوشتن داده، انتخاب پاسخ |
| URLconf | Router | نگاشت آدرس به View |
سفر یک درخواست
وقتی کاربر آدرس /orders/42/ را باز میکند، این اتفاقها به ترتیب میافتد:
- وبسرور (nginx) درخواست را به سرور برنامه (gunicorn برای WSGI یا uvicorn برای ASGI) میدهد.
- جنگو یک شیء
HttpRequestمیسازد و آن را از لایههای Middleware به ترتیب تعریفشده در settings عبور میدهد (Session، Authentication، CSRF و…). - URL Resolver فهرست urlpatterns را از بالا به پایین میگردد و اولین الگوی منطبق را پیدا میکند.
- View اجرا میشود؛ معمولاً از ORM داده میخواند و با یک Template پاسخ HTML میسازد.
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 همگام شما در هر دو کار میکند.