6 poin oleh GN⁺ 2025-12-05 | 1 komentar | Bagikan ke WhatsApp
  • Versi 6.0 dari framework web Django telah dirilis, mendukung Python 3.12 ke atas, dengan peningkatan besar pada fitur keamanan, template, dan asinkron
  • Content Security Policy (CSP) kini terintegrasi secara bawaan sehingga kebijakan untuk melindungi dari serangan injeksi konten seperti XSS dapat dikonfigurasi
  • Fitur Template Partials memungkinkan definisi bagian template yang dapat digunakan ulang, sehingga modularisasi kode menjadi lebih baik
  • Framework Background Tasks ditambahkan untuk mendukung eksekusi pekerjaan asinkron di luar siklus request-response
  • Dengan adopsi API email terbaru Python, penghentian dukungan MariaDB 10.5, dan perubahan nilai default DEFAULT_AUTO_FIELD, dilakukan penyesuaian kompatibilitas dan modernisasi

Kompatibilitas Python

  • Django 6.0 mendukung Python 3.12, 3.13, 3.14, dan hanya rilis terbaru dari tiap seri yang didukung secara resmi
  • Django 5.2.x adalah versi terakhir yang mendukung Python 3.10 dan 3.11
  • Setelah Django 6.0, aplikasi pihak ketiga disarankan untuk menghentikan dukungan bagi versi sebelum Django 5.2

Fitur baru utama

Dukungan Content Security Policy (CSP)

  • Standar CSP kini tertanam di Django untuk memperkuat pertahanan terhadap serangan injeksi konten seperti XSS
    • Kebijakan dapat didefinisikan melalui ContentSecurityPolicyMiddleware, context processor csp(), dan pengaturan SECURE_CSP
    • Mendukung konfigurasi kebijakan yang jelas dan aman berbasis dictionary Python
  • Mode pemantauan dapat diaktifkan dengan SECURE_CSP_REPORT_ONLY
  • Disediakan decorator untuk menimpa atau menonaktifkan kebijakan per view

Template Partials

  • Ditambahkan tag partialdef dan partial untuk mendefinisikan dan menggunakan ulang bagian template (fragment)
  • Dengan sintaks template_name#partial_name, bagian ini dapat dirujuk langsung dari get_template(), render(), {% include %}, dan lainnya
  • Tersedia panduan migrasi bagi pengguna paket pihak ketiga django-template-partials

Framework Background Tasks

  • Django kini menambahkan framework bawaan untuk menjalankan pekerjaan asinkron
    • Dapat digunakan untuk mengirim email, memproses data, dan tugas lain di luar siklus request-response HTTP
    • Tugas didefinisikan dengan decorator @task dan dimasukkan ke antrean dengan enqueue()
  • Backend ditentukan melalui pengaturan TASKS, dan dua backend bawaan disertakan untuk pengembangan dan pengujian
  • Django hanya menangani pembuatan dan pengantrean tugas, sedangkan eksekusi harus dilakukan oleh proses worker eksternal

Adopsi API email terbaru Python

  • Logika pemrosesan email Django beralih ke API email modern Python sejak 3.6 (email.message.EmailMessage)
  • Kelas lama SafeMIMEText dan SafeMIMEMultipart tidak lagi digunakan
  • Tipe hasil pengembalian EmailMessage.message() berubah menjadi instance EmailMessage milik Python

Peningkatan detail

Admin

  • Mengadopsi set ikon Font Awesome Free 6.7.2
  • Form ubah kata sandi admin kini dapat dikustomisasi melalui properti AdminSite.password_change_form
  • Ikon dan gaya CSS terpisah diterapkan untuk messages.DEBUG dan messages.INFO

Auth

  • Jumlah iterasi hash PBKDF2 meningkat dari 1,000,000 → 1,200,000

GIS

  • Properti GEOSGeometry.hasm memungkinkan pengecekan dimensi M
  • Fungsi Rotate mendukung rotasi dengan sudut tertentu
  • Properti BaseGeometryWidget.base_layer memungkinkan kustomisasi penyedia tile peta
  • Di MariaDB 12.0.1 ke atas, didukung fitur seperti coveredby, isvalid, GeoHash, IsValid, dan lainnya
  • JavaScript inline dihapus saat rendering widget, sehingga kustomisasi kini memerlukan perubahan template

PostgreSQL

  • Penambahan ekspresi Lexeme meningkatkan kontrol terhadap kueri pencarian teks penuh
  • Parameter hints ditambahkan ke operasi terkait ekstensi seperti CreateExtension
  • Pemeriksaan sistem ditambahkan untuk field, indeks, dan constraint terkait django.contrib.postgres

Staticfiles

  • ManifestStaticFilesStorage kini menjamin konsistensi pengurutan path, sehingga mengurangi diff yang tidak perlu
  • Perintah collectstatic secara default hanya menampilkan ringkasan, sedangkan detail ditampilkan pada --verbosity 2 atau lebih tinggi

Lainnya

  • Dukungan untuk bahasa Haitian Creole ditambahkan
  • Perintah startproject dan startapp kini otomatis membuat direktori yang belum ada
  • Di perintah shell, utilitas dasar seperti django.conf.settings diimpor otomatis
  • Migrasi kini mendukung serialisasi zoneinfo.ZoneInfo
  • Ditambahkan fungsi agregasi baru seperti StringAgg dan AnyValue
  • AsyncPaginator dan AsyncPage menghadirkan pagination asinkron
  • Lingkungan ASGI kini mendukung header Cookie HTTP/2 multipel
  • Variabel forloop.length ditambahkan ke template, dan tag querystring ditingkatkan
  • DiscoverRunner kini mendukung pengujian paralel dengan metode forkserver

Perubahan yang tidak kompatibel

API backend database

  • BaseDatabaseSchemaEditor dan backend PostgreSQL tidak lagi menggunakan CASCADE saat menghapus kolom
  • Nama metode berubah, seperti return_insert_columns()returning_columns()
  • Jika mendukung UPDATE … RETURNING, dapat mengatur DatabaseFeatures.can_return_rows_from_update=True

Dukungan yang dihentikan

  • Dukungan untuk MariaDB 10.5 dihentikan (memerlukan 10.6 ke atas)
  • Dukungan untuk Python di bawah 3.12 dihentikan
    • Versi minimum library utama mencakup aiosmtpd 1.4.5, bcrypt 4.1.1, Pillow 10.1.0, psycopg 3.1.12, dan lainnya

Email

  • Properti mixed_subtype, alternative_subtype, dan encoding dihapus
  • Karena perubahan implementasi internal, subclass EmailMessage kustom perlu ditinjau

Perubahan nilai default DEFAULT_AUTO_FIELD

  • Nilai default berubah dari AutoFieldBigAutoField
  • Proyek yang belum menangani peringatan Django 3.2 (models.W042) perlu menambahkan pengaturan terkait

Ekspresi ORM

  • Parameter return dari metode as_sql() harus berbentuk tuple

Lainnya

  • Serialisasi JSON kini selalu menambahkan baris baru
  • Versi minimum asgiref dinaikkan menjadi 3.9.1

Fitur yang akan deprecated

API django.core.mail

  • Di get_connection(), send_mail(), dan lainnya, argumen opsional harus diberikan hanya sebagai keyword argument
  • Saat membuat EmailMessage dan EmailMultiAlternatives, selain empat argumen pertama, sisanya hanya boleh berupa keyword argument

Lainnya

  • BaseDatabaseCreation.create_test_db(serialize) akan deprecated, gunakan serialize_db_to_string()
  • StringAgg dan OrderableAggMixin khusus PostgreSQL akan deprecated
  • Protokol default urlize dan urlizetrunc akan berubah ke HTTPS di Django 7.0
  • Pengaturan ADMINS dan MANAGERS harus ditetapkan sebagai daftar string email, bukan tuple (nama, alamat)
  • Kelas terkait email seperti SafeMIMEText, SafeMIMEMultipart, dan BadHeaderError akan deprecated

Fitur yang dihapus

  • Dukungan argumen posisi pada BaseConstraint dihapus
  • DjangoDivFormRenderer dan Jinja2DivFormRenderer dihapus
  • Dukungan driver database cx_Oracle dihapus
  • Skema default forms.URLField berubah dari "http""https"
  • Dukungan argumen posisi pada Model.save() dan Model.asave() dihapus
  • ModelAdmin.log_deletion() dan LogEntryManager.log_action() dihapus
  • Modul django.utils.itercompat dihapus
  • Metode GeoIP2.coords() dan GeoIP2.open() dihapus
  • ForeignObject.get_joining_columns() dan metode terkait dihapus

Django 6.0 meningkatkan stabilitas dan skalabilitas framework melalui penguatan keamanan, pemrosesan asinkron, dan adopsi API email modern, sekaligus memperjelas transisi ke lingkungan Python 3.12 ke atas.

1 komentar

 
GN⁺ 2025-12-05
Komentar Hacker News
  • Di organisasi tempat saya pernah bekerja, ada codebase ‘modern’ berbasis NodeJS+React, dan aplikasi legacy Django berbasis Python 2.7 yang usianya hampir 15 tahun
    Awalnya saya khawatir kode lamanya akan menyiksa, tetapi ternyata justru sebaliknya
    Aplikasi Django itu menyenangkan untuk ditangani, dan proses merapikannya benar-benar seru. Saat nanti diganti dengan rewrite Go/React yang baru, saya rasa saya akan merasa sayang

    • Saya tidak paham kenapa harus diganti. Kalau tidak rusak, tidak perlu diubah
  • Selamat kepada tim Django
    Saya sudah lama memelihara aplikasi starter Django + Celery + Postgres + Redis + esbuild + Tailwind berbasis Docker Compose, dan baru-baru ini saya memperbaruinya agar sesuai dengan Django 6.0
    Bisa dilihat di repositori GitHub
    Saya masih belum memasukkan konfigurasi CSP sebagai default, tetapi berencana menambahkannya setelah ditinjau lebih lanjut

    • Saya mau mem-bookmark-nya, lalu sadar ternyata saya sudah menyimpannya pada Desember 2023
    • Repositori Nick selalu kelas atas. Saya juga sering mengutipnya di materi saya sendiri. Terima kasih sudah membagikannya secara publik
    • Saya pernah memakai template ini di sebuah proyek beberapa tahun lalu, dan memang luar biasa
    • Belakangan saya melihat penambahan uv dan terasa bahwa proyek ini terus dirawat secara konsisten
  • Filosofi “batteries included” Django sangat cocok untuk generasi kode AI
    Panel admin, login, reset kata sandi, dan fitur dasar lain sudah tersedia dengan baik, jadi AI bisa membuat situs yang lengkap bahkan dengan codebase kecil
    Karena kodenya kecil dan jelas, AI juga lebih mudah melakukan perbaikan berulang

    • Kelebihan Django adalah struktur kodenya mudah dibaca manusia
      Alih-alih komponen raksasa, ada model dan template yang jelas, sehingga kode hasil AI juga lebih mudah direview
      Selain itu, Django admin hadir sebagai ground truth yang terpisah, jadi walaupun frontend rusak, data tetap bisa dikelola
      Hanya saja, saya menyayangkan ekosistem Python tidak mengadopsi model gevent. Kalau iya, transisi ke async pasti akan jauh lebih mulus
    • Berkat struktur INSTALLED_APPS di Django, fitur bisa dengan mudah ditambah atau dihapus per aplikasi
      Ini jauh lebih terintegrasi dibanding framework yang terhubung longgar seperti Flask atau FastAPI
      Perbedaan seperti ini pada akhirnya mengurangi banyak gangguan kecil (papercuts)
    • Saya sudah memakai Django dan Rails, dan saat diuji dengan Claude Code, Rails bekerja jauh lebih baik
      Saya me-rewrite aplikasi .NET lama, dan Rails mengonversinya hampir sempurna, sementara Django kesulitan
    • Sebenarnya Ruby on Rails sudah sejak lama menyediakan berbagai fitur seperti CSP, background worker, dan lainnya secara bawaan
    • Django sudah sangat lama dipakai di proyek open source, jadi data kode untuk dipelajari AI juga melimpah
  • Fitur template partials di rilis ini terlihat cukup bagus
    Tetapi kondisi type annotations masih tetap merepotkan
    django-stubs memerlukan plugin mypy, django-types adalah fork untuk pyright tetapi sinkronisasinya kurang baik
    pylance juga memakai fork-nya sendiri
    Saya berharap versi berikutnya setidaknya secara resmi menyertakan tipe dasar seperti HttpRequest, HttpResponse, View, dan Model

  • Berkat Django, pengembangan web benar-benar terasa menyenangkan
    Walaupun pindah ke framework lain, pada akhirnya saya selalu kembali ke Django. Itu adalah pilihan tanpa penyesalan

    • Saya mengalami hal yang sama dengan Ruby on Rails
      Mau mencoba framework lain pun, pada akhirnya saya kembali karena kenyamanan Rails
      Hanya saja, saya menyayangkan Rails tidak punya Admin UI bawaan
    • Kalau hanya melihat backend, Django memang hebat, tetapi dari sisi frontend masih terasa seperti zaman batu
      Kalau ingin full stack yang benar-benar lengkap, lebih baik lihat Laravel atau Rails
    • Sejujurnya saya kurang paham daya tarik Django
      Saya sudah berkecimpung di web sejak era PHP, dan Django selalu terasa biasa saja bagi saya
  • Django adalah proyek besar freelance pertama saya, dan sampai sekarang masih terasa akrab
    Saya sudah mencoba berbagai eksperimen, tetapi selalu berjalan dengan baik. Terima kasih, Django

  • Saya sudah hampir eksklusif memakai Django selama sekitar 15 tahun
    Saya mencoba banyak framework lain, tetapi tidak ada yang sepas di tangan seperti Django
    Di rilis kali ini mereka menambahkan task framework, tetapi sayang backend dan worker-nya tidak ikut disertakan
    Saya justru berharap versi berikutnya menghadirkan bentuk yang lengkap

    • Saya penasaran apakah Django memang berniat melampaui batas itu. Dari filosofi framework-nya, sepertinya mereka sangat menekankan menjaga batas
    • Jangan sampai kesempurnaan menjadi musuh dari kebaikan. Pada akhirnya Django adalah framework untuk “perfeksionis yang punya tenggat waktu”
  • Berkat konfigurasi bawaan yang lengkap (batteries included), Django cocok untuk proyek apa pun tanpa memandang skala
    Pujian untuk tim dan para kontributornya

  • Saya penasaran bagaimana kita bisa masuk ke era SPA. Apakah awalnya hanya untuk menghilangkan loading spinner, atau memang ada alasan yang lebih dalam

    • Salah satu alasan utamanya adalah munculnya aplikasi mobile
      Ketika web, iOS, dan Android dibuat berbagi satu backend, pola SPA pun menyebar secara alami
      Saya sendiri masih membuat SPA, tetapi suatu hari ingin mencoba proyek besar dengan Django + htmx
    • Dulu saya beralih ke SPA saat membuat visualisasi data dengan Angular
      Menjalankan aplikasi seperti app tanpa reload halaman memang menarik, tetapi dalam praktiknya sering juga perlu force refresh
      Meski begitu, saya tetap menganggap struktur yang memisahkan data dan presentasi itu elegan
    • Web awalnya dibuat untuk merender dokumen, tetapi pengguna menginginkan aplikasi
      Karena itu, upaya untuk mengubah dokumen menjadi seperti aplikasi lewat JS terus berlanjut
    • Pada masa ketika internet lambat dan validasi backend juga lambat, JS ditambahkan untuk validasi form, lalu kompleksitasnya makin membesar
      Pada akhirnya frontend dan backend dipisahkan, lalu muncullah kontrak API dan prosedur validasi
      Belakangan muncul lagi arus untuk menyatukannya kembali lewat server components, dan sekarang kita berada di titik itu
      Sebagai referensi, contoh webform gaya lama bisa dilihat di tautan ini
    • Template seperti di Django atau Rails kurang memiliki type safety
      Karena itu saya jadi lebih menyukai build process berbasis TypeScript
  • Setiap kali memakai Django, saya hanya merasakan kesenangan. Itu saja.