Lanzamiento de Django 6
(docs.djangoproject.com)- Se lanzó la versión 6.0 del framework web Django con soporte para Python 3.12 o superior, y una mejora sustancial en seguridad, plantillas y capacidades asíncronas.
- Incluye nativamente Content Security Policy (CSP), lo que permite definir políticas para protegerse de ataques de inyección de contenido como XSS.
- Con la funcionalidad Template Partials, se pueden definir secciones reutilizables dentro de los templates, mejorando la modularidad del código.
- Se agregó el Background Tasks Framework para habilitar la ejecución de tareas asíncronas fuera del ciclo de solicitud-respuesta.
- La adopción de una API de correo de Python más moderna, el fin del soporte de MariaDB 10.5 y el cambio del valor predeterminado de
DEFAULT_AUTO_FIELDmodernizan la compatibilidad de la versión.
Compatibilidad con Python
- Django 6.0 es compatible con Python 3.12, 3.13 y 3.14, y solo da soporte oficial a las últimas versiones de cada rama.
- Django 5.2.x es la última versión que admite Python 3.10 y 3.11.
- A partir de Django 6.0 se recomienda que las apps de terceros dejen de soportar versiones anteriores a Django 5.2.
Novedades principales
Soporte de Content Security Policy (CSP)
- Django incorporó el estándar CSP, reforzando la protección contra ataques de inyección de contenido como XSS.
ContentSecurityPolicyMiddleware, el context processorcsp()y la configuraciónSECURE_CSPpermiten definir políticas.- La configuración basada en diccionarios de Python permite construir políticas claras y seguras.
- Es posible activar un modo de monitoreo con
SECURE_CSP_REPORT_ONLY. - Se incluye un decorador para sobrescribir o desactivar la política por vista.
Template Partials
- Se agregaron las etiquetas
partialdefypartialpara definir y reutilizar fragmentos dentro de templates. - Se puede referenciar directamente desde
get_template(),render()y{% include %}usando la sintaxistemplate_name#partial_name. - Se proporciona una guía de migración para quienes usaban el paquete de terceros
django-template-partials.
Background Tasks Framework
- Django agrega un framework integrado para ejecutar tareas asíncronas.
- Permite ejecutar tareas como envío de correos o procesamiento de datos fuera del ciclo de solicitud-respuesta HTTP.
- Las tareas se definen con el decorador
@tasky se registran conenqueue().
- El backend se configura mediante
TASKSe incluye dos backends predeterminados para desarrollo y pruebas. - Django solo se encarga de crear y encolar tareas; su ejecución debe ser realizada por un worker externo.
Adopción de la API de correo más moderna de Python
- La lógica de correo de Django se cambió al API de correo moderno de Python desde 3.6 (
email.message.EmailMessage). - Las clases antiguas
SafeMIMETextySafeMIMEMultipartquedaron obsoletas. - El tipo de retorno de
EmailMessage.message()cambió a una instancia deEmailMessagede Python.
Mejoras detalladas
Admin
- Se aplicó el paquete de íconos Font Awesome Free 6.7.2.
- Es posible personalizar el formulario de cambio de contraseña del admin mediante la propiedad
AdminSite.password_change_form. - Se aplicaron íconos y estilos CSS dedicados a
messages.DEBUGymessages.INFO.
Auth
- Las iteraciones de hash PBKDF2 aumentaron de 1,000,000 a 1,200,000.
GIS
- La propiedad
GEOSGeometry.hasmpermite verificar la presencia de una dimensión M. - La función
Rotatepermite rotar un ángulo específico. - La propiedad
BaseGeometryWidget.base_layerpermite personalizar proveedores de tiles. - En MariaDB 12.0.1+, se habilitan funciones como
coveredby,isvalid,GeoHashyIsValid. - Al renderizar widgets se eliminó JavaScript inline; al personalizarlos puede ser necesario editar la plantilla.
PostgreSQL
- Se agregaron expresiones
Lexemepara reforzar el control del buscador de texto completo. - Se añadió el parámetro
hintsa operaciones de extensiones comoCreateExtension. - Se agregaron comprobaciones del sistema para campos, índices y restricciones relacionados con
django.contrib.postgres.
Staticfiles
ManifestStaticFilesStorageahora garantiza una consistencia en el orden de rutas para reducir diferencias innecesarias.- El comando
collectstaticmuestra por defecto solo un resumen; los detalles aparecen a partir de--verbosity 2.
Varios
- Se agregó soporte para el criollo haitiano.
- Los comandos
startprojectystartappcrean automáticamente directorios inexistentes. - El comando
shellimporta automáticamente utilidades base comodjango.conf.settings. - Se agregó compatibilidad de serialización de
zoneinfo.ZoneInfoen migraciones. - Se agregaron nuevas funciones de agregación como
StringAggyAnyValue. AsyncPaginatoryAsyncPagehabilitan paginación asíncrona.- Se habilita soporte para múltiples encabezados de cookies HTTP/2 en entornos ASGI.
- Se agregó la variable
forloop.lengthen templates y se mejoró la etiquetaquerystring. DiscoverRunnerahora soporta pruebas paralelas conforkserver.
Cambios incompatibles
API de backend de base de datos
BaseDatabaseSchemaEditory el backend de PostgreSQL dejaron de usarCASCADEal eliminar columnas.- Se cambiaron nombres de métodos, como
return_insert_columns()areturning_columns(). - Se habilita
DatabaseFeatures.can_return_rows_from_update=Truecuando se soportaUPDATE … RETURNING.
Deprecado
- Se finalizó el soporte de MariaDB 10.5 (requiere 10.6 o superior).
- Se dejó de dar soporte a Python por debajo de 3.12.
- Versiones mínimas de librerías principales:
aiosmtpd 1.4.5,bcrypt 4.1.1,Pillow 10.1.0,psycopg 3.1.12, entre otras.
- Versiones mínimas de librerías principales:
- Se eliminaron los atributos
mixed_subtype,alternative_subtypeyencoding. - Debido a cambios internos, se requiere revisar las subclases personalizadas de
EmailMessage.
Cambio del valor predeterminado de DEFAULT_AUTO_FIELD
- El valor predeterminado cambió de
AutoFieldaBigAutoField. - Los proyectos que no abordaron la advertencia de Django 3.2 (
models.W042) deben agregar la configuración correspondiente.
Expresiones ORM
- Los parámetros de retorno del método
as_sql()deben ser una tupla.
Varios
- Se agregó siempre un salto de línea al serializar JSON.
- Se elevó la versión mínima de
asgirefa 3.9.1.
Funcionalidades en desuso próximas
API de django.core.mail
- En
get_connection(),send_mail()y similares, los argumentos opcionales deben pasarse solo como argumentos con nombre. - Al crear
EmailMessageyEmailMultiAlternatives, solo se permiten argumentos con nombre después de los primeros 4.
Varios
- Se deprecó
BaseDatabaseCreation.create_test_db(serialize); usaserialize_db_to_string()en su lugar. - Se deprecó
StringAggyOrderableAggMixinespecíficos de PostgreSQL. - Se prevé que en Django 7.0 el protocolo por defecto de
urlizeyurlizetrunccambie a HTTPS. ADMINSyMANAGERSahora deben ser listas de cadenas de correo, en lugar de tuplas de (nombre, dirección).- Se deprecaron clases de correo como
SafeMIMEText,SafeMIMEMultipartyBadHeaderError.
Características removidas
- Se eliminó el soporte de argumentos posicionales de
BaseConstraint. - Se eliminaron
DjangoDivFormRendereryJinja2DivFormRenderer. - Se eliminó el soporte del driver de base de datos
cx_Oracle. - El esquema predeterminado de
forms.URLFieldcambió de"http"a"https". - Se eliminó el soporte de argumentos posicionales en
Model.save()yModel.asave(). - Se eliminaron
ModelAdmin.log_deletion()yLogEntryManager.log_action(). - Se eliminó el módulo
django.utils.itercompat. - Se eliminaron los métodos
GeoIP2.coords()yGeoIP2.open(). - Se eliminaron
ForeignObject.get_joining_columns()y sus métodos relacionados.
Django 6.0 fortaleció la seguridad, el procesamiento asíncrono y la adopción de una API moderna de correo para mejorar la estabilidad y escalabilidad del framework, y dejó en claro la migración a entornos con Python 3.12+.
1 comentarios
Opiniones de Hacker News
En una organización donde trabajé antes había una base de código “moderna” hecha con NodeJS+React y una app legacy de Django sobre Python 2.7 con casi 15 años de antigüedad
Al principio me preocupaba que el código viejo fuera un dolor, pero en realidad fue todo lo contrario
La app de Django era un gusto de manejar y ordenar el código fue realmente divertido. Cuando llegue el momento de reemplazarla con un nuevo rewrite en Go/React, creo que la voy a extrañar
Felicidades al equipo de Django
Durante mucho tiempo he mantenido una starter app de Django + Celery + Postgres + Redis + esbuild + Tailwind basada en Docker Compose, y hace poco la actualicé para Django 6.0
Se puede ver en el repositorio de GitHub
Todavía no incluí la configuración de CSP por defecto, pero planeo agregarla después de revisarla mejor
La filosofía “batteries included” de Django encaja perfectamente con la generación de código por IA
El panel de administración, el login, el restablecimiento de contraseña y otras funciones básicas ya vienen bien resueltas, así que la IA puede crear un sitio completo incluso con una base de código pequeña
Como el código es compacto y claro, también es fácil que la IA lo mejore de forma iterativa
En vez de componentes gigantes, hay modelos y plantillas claras, así que también es más fácil revisar el código generado por IA
Además, el admin de Django existe como una ground truth independiente, así que incluso si el frontend se rompe, todavía puedes manejar los datos
Eso sí, es una pena que el ecosistema de Python no haya adoptado el modelo gevent. Si lo hubiera hecho, la transición a lo asíncrono habría sido mucho más fluida
Está mucho más integrado que frameworks de acoplamiento laxo como Flask o FastAPI
Esa diferencia termina reduciendo una enorme cantidad de pequeñas molestias (papercuts)
Reescribí una app vieja de .NET y Rails la convirtió casi a la perfección, pero Django tuvo dificultades
La función de template partials de esta versión se ve bastante bien
Pero el estado de las anotaciones de tipos (type annotations) sigue siendo incómodo
django-stubs necesita un plugin de mypy, django-types es un fork para pyright pero no se sincroniza bien
Y pylance además usa su propio fork
Ojalá en la próxima versión al menos se incluyan oficialmente tipos básicos como HttpRequest, HttpResponse, View y Model
Gracias a Django, desarrollar para la web fue realmente divertido
Aunque cambie a otros frameworks, al final siempre termino volviendo a Django. Fue una elección de la que nunca me arrepentí
Aunque pruebe otros frameworks, siempre vuelvo por lo cómodo que es Rails
Eso sí, me decepciona que Rails no tenga un Admin UI por defecto
Si quieres un stack realmente full stack, es mejor mirar Laravel o Rails
Llevo haciendo web desde la era de PHP, y Django siempre me pareció más o menos equis
Django fue mi primer gran proyecto freelance, y todavía me hace sentir cómodo
Probé varios enfoques experimentales, pero siempre funcionó bien. Gracias, Django
Llevo casi 15 años usando Django casi de manera exclusiva
He probado muchos otros frameworks, pero ninguno se ha sentido tan natural en las manos como Django
En esta versión agregaron el task framework, pero me decepciona que no incluya backend ni worker
Preferiría que lo incluyeran ya completo en la próxima versión
Gracias a su enfoque batteries included, Django encaja en proyectos de cualquier tamaño
Mis aplausos para el equipo y los contribuidores
Me pregunto cómo fue que entramos en la era de las SPA. Quisiera saber si fue simplemente por querer eliminar los loading spinners o si había una razón más profunda
Al hacer que web, iOS y Android compartieran un mismo backend, el patrón SPA se extendió de forma natural
Yo todavía hago SPA, pero algún día me gustaría encarar un proyecto grande con Django + htmx
Era atractivo que funcionara como una app sin recargar la página, pero en la práctica muchas veces igual hacía falta un hard refresh
Aun así, me parece elegante la estructura que separa datos y presentación
Por eso siguieron los intentos de convertir documentos en apps usando JS
Al final se separaron frontend y backend, y aparecieron contratos de API y procesos de validación
Más adelante volvió la tendencia de integrar todo con server components, y justo ahí es donde estamos ahora
Como ejemplo de formularios web a la antigua, se puede ver este enlace
Por eso terminé prefiriendo un proceso de build basado en TypeScript
Cada vez que uso Django, simplemente siento placer. Eso es todo.