6 điểm bởi GN⁺ 2025-12-05 | 1 bình luận | Chia sẻ qua WhatsApp
  • Phiên bản 6.0 của framework web Django đã được công bố, hỗ trợ Python 3.12 trở lên và tăng cường mạnh mẽ các tính năng bảo mật, template và bất đồng bộ
  • Content Security Policy (CSP) được tích hợp sẵn, cho phép cấu hình chính sách để phòng vệ trước các cuộc tấn công chèn nội dung như XSS
  • Tính năng Template Partials cho phép định nghĩa các phần có thể tái sử dụng trong template, giúp cải thiện khả năng mô-đun hóa mã nguồn
  • Đã bổ sung framework Background Tasks, hỗ trợ chạy tác vụ bất đồng bộ bên ngoài chu trình request-response
  • Việc áp dụng email API hiện đại mới nhất của Python, ngừng hỗ trợ MariaDB 10.5 và thay đổi giá trị mặc định của DEFAULT_AUTO_FIELD cho thấy các điều chỉnh về tính tương thích và hiện đại hóa

Tương thích Python

  • Django 6.0 hỗ trợ Python 3.12, 3.13, 3.14, và chỉ hỗ trợ chính thức bản phát hành mới nhất của từng nhánh
  • Django 5.2.x là phiên bản cuối cùng hỗ trợ Python 3.10 và 3.11
  • Kể từ Django 6.0, các ứng dụng bên thứ ba được khuyến nghị ngừng hỗ trợ các phiên bản trước Django 5.2

Tính năng mới chính

Hỗ trợ Content Security Policy (CSP)

  • Django tích hợp sẵn chuẩn CSP, tăng cường phòng vệ trước các cuộc tấn công chèn nội dung như XSS
    • Có thể định nghĩa chính sách thông qua ContentSecurityPolicyMiddleware, bộ xử lý ngữ cảnh csp() và cấu hình SECURE_CSP
    • Hỗ trợ cấu hình chính sách rõ ràng và an toàn dựa trên từ điển Python
  • Có thể bật chế độ giám sát bằng SECURE_CSP_REPORT_ONLY
  • Cung cấp decorator cho phép ghi đè hoặc vô hiệu hóa chính sách theo từng view

Template Partials

  • Bổ sung các thẻ partialdefpartial để định nghĩa và tái sử dụng một phần template (fragment)
  • Có thể tham chiếu trực tiếp bằng cú pháp template_name#partial_name trong get_template(), render(), {% include %} và các API khác
  • Cung cấp hướng dẫn migration cho người dùng gói bên thứ ba hiện có django-template-partials

Framework Background Tasks

  • Django được bổ sung framework tích hợp sẵn để chạy tác vụ bất đồng bộ
    • Có thể thực hiện gửi email, xử lý dữ liệu và các công việc khác bên ngoài chu trình request-response HTTP
    • Dùng decorator @task để định nghĩa tác vụ và enqueue() để đưa vào hàng đợi
  • Backend được chỉ định bằng cấu hình TASKS, và đi kèm 2 backend mặc định dành cho phát triển và kiểm thử
  • Django chỉ đảm nhiệm việc tạo và xếp hàng tác vụ; việc thực thi phải do worker process bên ngoài xử lý

Áp dụng email API hiện đại mới nhất của Python

  • Logic xử lý email của Django được chuyển sang email API hiện đại từ Python 3.6 trở lên (email.message.EmailMessage)
  • Các lớp SafeMIMEText, SafeMIMEMultipart cũ không còn được sử dụng
  • Kiểu trả về của EmailMessage.message() được đổi thành một instance EmailMessage của Python

Các cải tiến chi tiết

Admin

  • Áp dụng bộ biểu tượng Font Awesome Free 6.7.2
  • Có thể tùy biến form đổi mật khẩu quản trị thông qua thuộc tính AdminSite.password_change_form
  • Áp dụng biểu tượng và kiểu CSS riêng cho messages.DEBUGmessages.INFO

Auth

  • Số vòng lặp băm PBKDF2 tăng từ 1.000.000 lên 1.200.000

GIS

  • Có thể kiểm tra sự hiện diện của chiều M bằng thuộc tính GEOSGeometry.hasm
  • Hàm Rotate hỗ trợ xoay theo góc chỉ định
  • Có thể tùy biến nhà cung cấp tile bản đồ bằng thuộc tính BaseGeometryWidget.base_layer
  • Hỗ trợ các tính năng như coveredby, isvalid, GeoHash, IsValid trên MariaDB 12.0.1 trở lên
  • Loại bỏ JavaScript inline khi render widget; khi tùy biến cần chỉnh sửa template

PostgreSQL

  • Bổ sung biểu thức Lexeme để tăng khả năng kiểm soát truy vấn full-text search
  • Thêm tham số hints cho các thao tác liên quan đến extension như CreateExtension
  • Thêm kiểm tra hệ thống cho các field, index và constraint liên quan đến django.contrib.postgres

Staticfiles

  • ManifestStaticFilesStorage đảm bảo tính nhất quán khi sắp xếp đường dẫn, giúp giảm các diff không cần thiết
  • Lệnh collectstatic mặc định chỉ in phần tóm tắt; thông tin chi tiết chỉ hiển thị với --verbosity 2 trở lên

Khác

  • Bổ sung hỗ trợ ngôn ngữ Haitian Creole
  • Các lệnh startproject, startapp tự động tạo thư mục chưa tồn tại
  • Lệnh shell tự động import các tiện ích cơ bản như django.conf.settings
  • Hỗ trợ tuần tự hóa zoneinfo.ZoneInfo trong migration
  • Bổ sung các hàm tổng hợp mới như StringAgg, AnyValue
  • Hỗ trợ phân trang bất đồng bộ với AsyncPaginator, AsyncPage
  • Hỗ trợ nhiều header Cookie trong HTTP/2 ở môi trường ASGI
  • Thêm biến forloop.length trong template, cải tiến thẻ querystring
  • DiscoverRunner hỗ trợ kiểm thử song song theo cơ chế forkserver

Thay đổi không tương thích

API backend cơ sở dữ liệu

  • BaseDatabaseSchemaEditor và backend PostgreSQL ngừng dùng CASCADE khi xóa cột
  • Đổi tên phương thức như return_insert_columns()returning_columns()
  • Khi hỗ trợ UPDATE … RETURNING, có thể đặt DatabaseFeatures.can_return_rows_from_update=True

Ngừng hỗ trợ

  • Kết thúc hỗ trợ MariaDB 10.5 (yêu cầu từ 10.6 trở lên)
  • Kết thúc hỗ trợ Python thấp hơn 3.12
    • Phiên bản tối thiểu của các thư viện chính: aiosmtpd 1.4.5, bcrypt 4.1.1, Pillow 10.1.0, psycopg 3.1.12 v.v.

Email

  • Loại bỏ các thuộc tính mixed_subtype, alternative_subtype, encoding
  • Do thay đổi triển khai nội bộ, cần kiểm tra lại các subclass EmailMessage tùy biến

Thay đổi giá trị mặc định của DEFAULT_AUTO_FIELD

  • Giá trị mặc định đổi từ AutoField sang BigAutoField
  • Các dự án chưa xử lý cảnh báo từ Django 3.2 (models.W042) cần bổ sung cấu hình

Biểu thức ORM

  • Tham số trả về của phương thức as_sql() phải có kiểu tuple

Khác

  • Luôn thêm dòng xuống hàng khi tuần tự hóa JSON
  • Nâng phiên bản tối thiểu của asgiref lên 3.9.1

Tính năng dự kiến bị loại bỏ

API django.core.mail

  • Trong get_connection(), send_mail() v.v., tham số tùy chọn chỉ được truyền bằng keyword argument
  • Khi tạo EmailMessage, EmailMultiAlternatives, ngoài 4 tham số đầu tiên chỉ cho phép keyword argument

Khác

  • BaseDatabaseCreation.create_test_db(serialize) bị loại bỏ dần, thay bằng serialize_db_to_string()
  • StringAgg, OrderableAggMixin dành riêng cho PostgreSQL bị loại bỏ dần
  • Giao thức mặc định của urlize, urlizetrunc sẽ đổi sang HTTPS trong Django 7.0
  • Cấu hình ADMINS, MANAGERS phải được chỉ định bằng danh sách chuỗi email thay vì tuple (tên, địa chỉ)
  • Các lớp email như SafeMIMEText, SafeMIMEMultipart, BadHeaderError bị loại bỏ dần

Tính năng đã bị xóa

  • Loại bỏ hỗ trợ tham số vị trí của BaseConstraint
  • Xóa DjangoDivFormRenderer, Jinja2DivFormRenderer
  • Loại bỏ hỗ trợ driver cơ sở dữ liệu cx_Oracle
  • Scheme mặc định của forms.URLField đổi từ "http" sang "https"
  • Loại bỏ hỗ trợ tham số vị trí trong Model.save()Model.asave()
  • Xóa ModelAdmin.log_deletion(), LogEntryManager.log_action()
  • Loại bỏ module django.utils.itercompat
  • Xóa các phương thức GeoIP2.coords(), GeoIP2.open()
  • Loại bỏ ForeignObject.get_joining_columns() và các phương thức liên quan

Django 6.0 đã nâng cao độ ổn định và khả năng mở rộng của framework thông qua tăng cường bảo mật, xử lý bất đồng bộ và áp dụng email API hiện đại, đồng thời xác định rõ việc chuyển sang môi trường Python 3.12 trở lên.

1 bình luận

 
GN⁺ 2025-12-05
Ý kiến Hacker News
  • Ở tổ chức tôi từng làm việc trước đây có một codebase “hiện đại” dùng NodeJS+React và một ứng dụng Django legacy dựa trên Python 2.7 đã gần 15 năm tuổi
    Ban đầu tôi lo code cũ sẽ rất khổ sở, nhưng thực ra lại hoàn toàn ngược lại
    Ứng dụng Django rất dễ làm việc cùng và quá trình dọn dẹp nó thực sự rất thú vị. Khi đến lúc nó bị thay thế bằng bản viết lại bằng Go/React mới, có lẽ tôi sẽ thấy tiếc

    • Tôi không hiểu vì sao lại phải thay thế nó. Nếu nó chưa hỏng thì đâu cần sửa
  • Xin chúc mừng đội ngũ Django
    Tôi đã duy trì trong thời gian dài một ứng dụng khởi đầu Django + Celery + Postgres + Redis + esbuild + Tailwind dựa trên Docker Compose, và gần đây đã cập nhật nó cho Django 6.0
    Có thể xem tại kho lưu trữ GitHub
    Tôi vẫn chưa đưa cấu hình CSP vào mặc định, nhưng dự định sẽ thêm sau khi xem xét thêm

    • Tôi định lưu bookmark, nhưng rồi phát hiện mình đã lưu nó từ tháng 12 năm 2023 rồi
    • Các kho lưu trữ của Nick lúc nào cũng ở đẳng cấp hàng đầu. Tôi cũng thường xuyên trích dẫn chúng trong tài liệu của mình. Cảm ơn vì đã chia sẻ công khai
    • Tôi đã dùng template này cho một dự án vài năm trước, và nó thực sự rất tuyệt
    • Gần đây thấy đã thêm uv nên có thể cảm nhận được rằng nó vẫn đang được bảo trì đều đặn
  • Triết lý “batteries included” của Django cực kỳ phù hợp với việc sinh mã bằng AI
    Các chức năng cơ bản như bảng quản trị, đăng nhập, đặt lại mật khẩu... đã được chuẩn bị rất đầy đủ, nên AI có thể tạo ra một trang web hoàn chỉnh chỉ với một codebase nhỏ
    Code nhỏ và rõ ràng nên AI cũng dễ lặp lại để cải thiện

    • Điểm mạnh của Django là cấu trúc code dễ đọc với con người
      Thay vì các component khổng lồ, nó có các model và template rõ ràng, nên cũng dễ review mã do AI tạo ra
      Ngoài ra Django admin tồn tại như một ground truth độc lập, nên dù frontend có hỏng vẫn có thể xử lý dữ liệu
      Tuy vậy, việc hệ sinh thái Python không chấp nhận mô hình gevent vẫn là điều đáng tiếc. Nếu có thì quá trình chuyển sang bất đồng bộ đã mượt hơn nhiều
    • Nhờ cấu trúc INSTALLED_APPS của Django, có thể dễ dàng thêm hoặc gỡ tính năng theo từng app
      Nó tích hợp hơn nhiều so với các framework ghép nối lỏng như Flask hay FastAPI
      Sự khác biệt đó cuối cùng giúp giảm đi rất nhiều bất tiện nhỏ nhặt (papercuts)
    • Tôi đã dùng cả Django lẫn Rails, và khi thử với Claude Code thì Rails hoạt động tốt hơn hẳn
      Tôi đã viết lại một ứng dụng .NET cũ, Rails gần như chuyển đổi hoàn hảo còn Django thì khá chật vật
    • Thực ra Ruby on Rails đã từ lâu cung cấp sẵn nhiều tính năng như CSP, background worker và nhiều thứ khác
    • Django đã được dùng quá lâu trong các dự án mã nguồn mở, nên lượng dữ liệu code để AI học là rất phong phú
  • Tính năng template partials trong bản phát hành này trông khá ổn
    Nhưng tình trạng type annotations vẫn còn khó chịu
    django-stubs cần plugin mypy, còn django-types là một bản fork cho pyright nhưng không được đồng bộ tốt
    pylance thì lại dùng fork riêng của nó
    Tôi hy vọng ở phiên bản tiếp theo ít nhất sẽ có chính thức các kiểu cơ bản như HttpRequest, HttpResponse, View, Model

  • Nhờ Django mà việc phát triển web thực sự rất vui
    Dù chuyển sang framework khác, cuối cùng tôi vẫn quay về Django. Đó là một lựa chọn không hối tiếc

    • Tôi cũng có trải nghiệm tương tự với Ruby on Rails
      Dù thử framework khác, tôi vẫn quay lại vì sự tiện lợi của Rails
      Chỉ tiếc là Rails không có sẵn Admin UI mặc định
    • Nếu chỉ nhìn backend thì Django rất tuyệt, nhưng ở khía cạnh frontend thì nó vẫn còn ở thời kỳ đồ đá
      Nếu muốn một full-stack hoàn chỉnh thì nên xem Laravel hoặc Rails
    • Thành thật mà nói tôi không hiểu sức hút của Django
      Tôi làm web từ thời PHP, và Django lúc nào cũng cho cảm giác chỉ ở mức làng nhàng
  • Django là dự án freelance lớn đầu tiên của tôi, và đến giờ nó vẫn cho cảm giác rất quen thuộc
    Tôi đã thử nhiều hướng đi mang tính thử nghiệm, nhưng lúc nào nó cũng hoạt động tốt. Cảm ơn Django

  • Tôi đã gần như dùng Django một cách độc quyền suốt gần 15 năm
    Tôi cũng thử rất nhiều framework khác, nhưng không có cái nào hợp tay như Django
    Bản phát hành lần này đã thêm task framework, nhưng hơi tiếc là chưa bao gồm backend và worker
    Tôi mong phiên bản sau sẽ đưa vào ở dạng hoàn chỉnh hơn

    • Tôi tự hỏi liệu Django có định vượt qua ranh giới đó không. Xét theo triết lý của framework này thì có vẻ họ rất coi trọng việc giữ ranh giới
    • Đừng để sự hoàn hảo trở thành kẻ thù của điều tốt. Django rốt cuộc là framework dành cho “những người cầu toàn có deadline”
  • Nhờ cấu hình batteries included của Django, nó phù hợp với mọi dự án bất kể quy mô
    Xin gửi lời khen tới đội ngũ và các cộng tác viên

  • Tôi tò mò làm sao chúng ta lại bước vào thời đại SPA. Có phải chỉ để bỏ loading spinner, hay còn lý do sâu xa hơn?

    • Một trong những lý do cốt lõi là sự xuất hiện của ứng dụng di động
      Khi web·iOS·Android cùng chia sẻ một backend, mô hình SPA tự nhiên lan rộng
      Tôi vẫn làm SPA, nhưng một ngày nào đó cũng muốn làm một dự án lớn với Django + htmx
    • Trước đây tôi chuyển sang SPA khi làm trực quan hóa dữ liệu bằng Angular
      Việc nó hoạt động như một ứng dụng mà không cần reload trang rất hấp dẫn, nhưng trên thực tế vẫn có nhiều lúc cần làm mới cưỡng bức
      Dù vậy, tôi vẫn thấy cấu trúc tách biệt giữa dữ liệu và phần trình bày là rất thanh lịch
    • Web vốn được tạo ra để render tài liệu, nhưng người dùng lại muốn ứng dụng
      Vì vậy các nỗ lực dùng JS để biến tài liệu thành ứng dụng đã liên tục xuất hiện
    • Vào thời internet còn chậm và việc kiểm tra ở backend còn chậm, người ta thêm JS để xác thực biểu mẫu, rồi mọi thứ dần trở nên phức tạp
      Cuối cùng frontend và backend bị tách ra, sinh ra hợp đồng API và quy trình xác thực
      Sau đó lại xuất hiện xu hướng tích hợp trở lại bằng server components, và hiện tại chúng ta đang ở đúng điểm đó
      Nhân tiện, có thể xem một ví dụ webform kiểu cũ ở liên kết này
    • Các template như của Django hay Rails thiếu type safety
      Vì vậy tôi dần thích quy trình build dựa trên TypeScript hơn
  • Mỗi lần dùng Django tôi chỉ đơn giản cảm thấy niềm vui. Chỉ vậy thôi.