📰 مقالات 🐍 اخبار پایتون جنگو ۶: بزرگ‌ترین نسخه در سال…
📝 مقاله 🐍 اخبار پایتون ⭐ ویژه

جنگو ۶: بزرگ‌ترین نسخه در سال‌های اخیر — راهنمای کامل

از CSP داخلی تا Background Tasks و Template Partials — همه چیز درباره Django 6.0

جنگو ۶: بزرگ‌ترین نسخه در سال‌های اخیر — راهنمای کامل
meisam
میثم شبانی
نویسنده
📅 ۱۴۰۵/۰۳/۰۸
10 دقیقه
👁 38
❤️ 3

سوم دسامبر ۲۰۲۵، تیم جنگو یکی از مهم‌ترین نسخه‌های تاریخ این فریمورک را منتشر کرد. Django 6.0 نه یک به‌روزرسانی تدریجی، بلکه یک تحول واقعی است — چهار ویژگی اصلی که هر کدام به تنهایی می‌توانستند یک نسخه minor را توجیه کنند، اینجا در یک نسخه major کنار هم آمده‌اند.

اگر با جنگو کار می‌کنید، این مقاله را تا آخر بخوانید. چیزهایی که تغییر کرده، روش کار شما را عوض می‌کند.

💡
Django 6.0 — اطلاعات سریع

تاریخ انتشار: ۳ دسامبر ۲۰۲۵
پایتون پشتیبانی‌شده: 3.12، 3.13، 3.14
آخرین نسخه LTS: Django 5.2
نوع نسخه: Short-term support (STS)

۱. Content Security Policy — امنیت داخلی فریمورک

یکی از بزرگ‌ترین چالش‌های امنیتی در وب، حملات XSS (Cross-Site Scripting) است. تا پیش از Django 6.0، برای پیاده‌سازی Content Security Policy مجبور بودید از پکیج‌های third-party مثل django-csp استفاده کنید. حالا این قابلیت به صورت کاملاً داخلی در Django وجود دارد.

CSP به مرورگر می‌گوید دقیقاً از کجا می‌تواند script، style، تصویر و سایر منابع را بارگذاری کند — و هر چیزی که در این لیست نباشد، بلاک می‌شود.

🐍 PYTHON — تنظیم CSP در settings.py
from django.utils.csp import CSP # settings.py SECURE_CSP = { "default-src": [CSP.SELF], "script-src": [CSP.SELF, CSP.NONCE], "img-src": [CSP.SELF, "https:"], "style-src": [CSP.SELF, CSP.UNSAFE_INLINE], } # فعال‌سازی middleware MIDDLEWARE = [ ... "django.middleware.csp.ContentSecurityPolicyMiddleware", ... ] # هدر خروجی: # Content-Security-Policy: default-src 'self'; # script-src 'self' 'nonce-SECRET'; img-src 'self' https:
💫
حالت Report-Only

برای تست قبل از اجرا از SECURE_CSP_REPORT_ONLY استفاده کنید. این حالت CSP را enforce نمی‌کند اما نقض‌ها را در console مرورگر گزارش می‌دهد — عالی برای migration تدریجی.

۲. Template Partials — قطعه‌های قابل استفاده مجدد

یکی از دردهای قدیمی جنگو این بود: برای استفاده مجدد از یک بخش کوچک HTML، مجبور بودید یک فایل template جداگانه بسازید. Django 6.0 این مشکل را با Template Partials حل کرد.

حالا می‌توانید قطعه‌های کوچک HTML را داخل همان فایل template تعریف کنید و هر جا خواستید — حتی در فایل‌های دیگر — از آن استفاده کنید.

🌐 HTML — تعریف و استفاده از Template Partial
{% load partials %} {# تعریف partial داخل همان فایل #} {% partialdef user-card %} <div class="user-card"> <img src="{{ user.avatar }}" alt="{{ user.name }}"> <h3>{{ user.name }}</h3> <p>{{ user.bio }}</p> </div> {% endpartialdef %} {# استفاده در همان فایل #} {% partial user-card with user=request.user %} {# استفاده از فایل دیگر #} {% include "components/cards.html#user-card" with user=author %} {# استفاده در view با render() #} # views.py return render(request, "cards.html#user-card", {"user": user})
مهاجرت از django-template-partials

اگر از پکیج third-party django-template-partials استفاده می‌کنید، یک migration guide رسمی وجود دارد. در اکثر موارد فقط باید import را تغییر دهید.

۳. Background Tasks — وداع با Celery برای کارهای ساده

تا پیش از Django 6.0، برای اجرای کدی خارج از چرخه request-response مجبور بودید Celery، Redis، و تنظیمات پیچیده راه‌اندازی کنید. Django 6.0 یک Tasks framework داخلی معرفی کرده که برای اکثر کارهای رایج کافی است.

در PyCourse خودمان از Celery استفاده می‌کنیم — اما برای پروژه‌های کوچک‌تر، این ویژگی جدید یک نعمت واقعی است.

🐍 PYTHON — تعریف و اجرای Background Task
from django.core.mail import send_mail from django.tasks import task # تعریف task با decorator @task def send_welcome_email(user_id, username): send_mail( subject="خوش آمدید به PyCourse", message=f"سلام {username}! حساب شما فعال شد.", from_email="no-reply@pycourse.ir", recipient_list=[f"{username}@example.com"], ) return {"status": "sent", "user_id": user_id} # اجرای async در view def register_view(request): user = User.objects.create(...) # بلافاصله return می‌کند — task در background اجرا می‌شود send_welcome_email.enqueue( user_id=user.id, username=user.username ) return redirect("dashboard")
🐍 PYTHON — تنظیم backend در settings.py
# settings.py TASKS = { "default": { # برای development "BACKEND": "django.tasks.backends.immediate.ImmediateBackend", # برای production — نیاز به worker جداگانه # "BACKEND": "django.tasks.backends.database.DatabaseBackend", } } # اجرای worker برای DatabaseBackend # python manage.py run_worker
⚠️
نکته مهم: این Celery نیست

Background Tasks داخلی Django برای کارهای ساده مثل ارسال ایمیل یا پردازش‌های سبک مناسب است. برای کارهای سنگین مثل پردازش تصویر، صف‌های پیچیده، و retry logic پیشرفته، هنوز Celery گزینه بهتری است.

۴. Email API مدرن — خداحافظی با MIME قدیمی

Django حالا از Python email API مدرن استفاده می‌کند که در Python 3.6 معرفی شد. این تغییر یعنی ارسال ایمیل Unicode-friendly‌تر، ساده‌تر، و بدون نیاز به کار مستقیم با کلاس‌های MIME است.

برای اکثر کاربران این تغییر شفاف است — کد قدیمی کار می‌کند — اما اگر مستقیماً با خروجی متد message() کار می‌کردید، نوع برگشتی تغییر کرده است.

🐍 PYTHON — Email API جدید در Django 6.0
from django.core.mail import EmailMessage # قبل از Django 6.0 — SafeMIMEText # msg.message() -> SafeMIMEText # Django 6.0 — Python native EmailMessage msg = EmailMessage( subject="خبرنامه PyCourse", body="<h1>آخرین مقالات</h1><p>این هفته چی داریم...</p>", from_email="newsletter@pycourse.ir", to=["user@example.com"], ) msg.content_subtype = "html" # msg.message() -> email.message.EmailMessage (Python native) msg.send()

۵. Async Views — دیگر نیازی به sync_to_async نیست

Django 6.0 پشتیبانی async را به یک شهروند درجه اول تبدیل کرده. قبلاً async views وجود داشت اما برای کارهای database مجبور بودید از sync_to_async() wrapper استفاده کنید. حالا می‌توانید کاملاً native async بنویسید.

🐍 PYTHON — Async View در Django 6.0
# قبل از Django 6.0 — پر از boilerplate from asgiref.sync import sync_to_async async def old_view(request): user = await sync_to_async(User.objects.get)(id=request.user.id) posts = await sync_to_async(list)(Post.objects.filter(author=user)) return JsonResponse({"count": len(posts)}) # Django 6.0 — تمیز و native async def new_view(request): user = await User.objects.aget(id=request.user.id) posts = await Post.objects.filter(author=user).acount() return JsonResponse({"count": posts})

۶. سایر تغییرات مهم

بخشتغییراهمیت
Pythonفقط 3.12+ پشتیبانی می‌شودزیاد
MariaDBحداقل نسخه 10.6متوسط
Adminآیکون‌های Font Awesome 6.7.2کم
AuthPBKDF2 iteration count بالاترزیاد
ORMبهبود عملکرد queryزیاد
EmailAPI مدرن Pythonمتوسط

۷. آیا باید آپگرید کنید؟

Django 6.0 یک STS (Short-Term Support) است — نه LTS. یعنی فقط تا Django 6.1 پشتیبانی می‌شود. اگر پایداری بلندمدت می‌خواهید، Django 5.2 LTS هنوز گزینه بهتری است.

اما اگر می‌خواهید از CSP داخلی، Background Tasks، و Template Partials استفاده کنید — وقت آپگرید است.

💻 BASH — آپگرید به Django 6.0
# بررسی سازگاری قبل از آپگرید pip install django-upgrade django-upgrade --target-version 6.0 . # نصب pip install "Django>=6.0,<6.1" # بررسی deprecation warnings python -Wd manage.py test # بررسی breaking changes python manage.py check --deploy
⚠️
Python 3.10 و 3.11 دیگر پشتیبانی نمی‌شوند

Django 5.2 آخرین نسخه‌ای است که از Python 3.10 و 3.11 پشتیبانی می‌کند. اگر هنوز روی این نسخه‌ها هستید، قبل از آپگرید Django باید Python را هم آپگرید کنید.

Django 6.0 نه یک به‌روزرسانی تدریجی، بلکه یک mozaic از ابزارهای مدرن و طراحی هوشمندانه است که نحوه نوشتن template امن، ساختار workflow غیرهمزمان، و مقیاس‌پذیری برنامه‌های پیچیده را بازتعریف می‌کند.
Natalia Bidart · Django Core Developer

جمع‌بندی

  • CSP داخلی: محافظت از XSS بدون پکیج third-party
  • Template Partials: قطعه‌های قابل استفاده مجدد داخل template
  • Background Tasks: اجرای کد خارج از request-response بدون Celery
  • Email API مدرن: Unicode-friendly و ساده‌تر
  • Async native: بدون sync_to_async boilerplate
  • Python 3.12+ only: بهره‌مندی از ویژگی‌های مدرن
  • django-upgrade: ابزار خودکار برای migration
Django ۲۰ ساله شد!

Django 6.0 همزمان با بیستمین سالگرد این فریمورک (۲۱ ژوئیه ۲۰۰۵) منتشر شد. ۲۰ سال بعد، هنوز یکی از بهترین انتخاب‌ها برای web development با Python است.