Phát hành Django 6
(docs.djangoproject.com)- 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_FIELDcho 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ảnhcsp()và cấu hìnhSECURE_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ể định nghĩa chính sách thông qua
- 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ẻ
partialdefvàpartialđể đị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_nametrongget_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,SafeMIMEMultipartcũ không còn được sử dụng - Kiểu trả về của
EmailMessage.message()được đổi thành một instanceEmailMessagecủ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.DEBUGvàmessages.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
Rotatehỗ 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,IsValidtrê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ố
hintscho 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
collectstaticmặc định chỉ in phần tóm tắt; thông tin chi tiết chỉ hiển thị với--verbosity 2trở lên
Khác
- Bổ sung hỗ trợ ngôn ngữ Haitian Creole
- Các lệnh
startproject,startapptự động tạo thư mục chưa tồn tại - Lệnh
shelltự động import các tiện ích cơ bản nhưdjango.conf.settings - Hỗ trợ tuần tự hóa
zoneinfo.ZoneInfotrong 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.lengthtrong template, cải tiến thẻquerystring DiscoverRunnerhỗ 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
BaseDatabaseSchemaEditorvà backend PostgreSQL ngừng dùngCASCADEkhi xóa cột- Đổi tên phương thức như
return_insert_columns()→returning_columns() - Khi hỗ trợ
UPDATE … RETURNING, có thể đặtDatabaseFeatures.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.12v.v.
- Phiên bản tối thiểu của các thư viện chính:
- 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ừ
AutoFieldsangBigAutoField - 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
asgireflê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ằngserialize_db_to_string()StringAgg,OrderableAggMixindành riêng cho PostgreSQL bị loại bỏ dần- Giao thức mặc định của
urlize,urlizetruncsẽ đổi sang HTTPS trong Django 7.0 - Cấu hình
ADMINS,MANAGERSphả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,BadHeaderErrorbị 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()và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
Ý 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
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
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
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
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 đã 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
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
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 muốn một full-stack hoàn chỉnh thì nên xem Laravel hoặc Rails
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
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?
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
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
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
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
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.