Django 6-Veröffentlichung
(docs.djangoproject.com)- Das Web-Framework Django 6.0 wurde veröffentlicht, unterstützt Python 3.12 oder höher und stärkt Sicherheit, Templates und asynchrone Funktionalitäten deutlich.
- Die eingebaute Content Security Policy (CSP) ermöglicht Richtlinieneinstellungen, um Inhaltsinjektionen wie XSS besser abzuwehren.
- Mit der Funktion Template Partials können wiederverwendbare Teile innerhalb von Templates definiert werden, wodurch die Code-Modularisierung verbessert wird.
- Ein Background Tasks Framework wurde hinzugefügt und unterstützt die Ausführung asynchroner Aufgaben außerhalb des Anfrage-Antwort-Zyklus.
- Die Einführung der modernen Python-E-Mail-API, das Ende des Supports für MariaDB 10.5 und die Änderung des Standardwerts von
DEFAULT_AUTO_FIELDsorgen für Kompatibilitätsanpassungen und Modernisierung.
Python-Kompatibilität
- Django 6.0 unterstützt Python 3.12, 3.13, 3.14; pro Serie wird nur der jeweils neueste Release offiziell unterstützt.
- Django 5.2.x ist die letzte Version, die Python 3.10 und 3.11 unterstützt.
- Nach Django 6.0 wird empfohlen, dass Drittanbieter-Apps den Support für Versionen vor Django 5.2 aufgeben.
Wichtige neue Funktionen
Unterstützung für Content Security Policy (CSP)
- Django enthält den CSP-Standard, wodurch der Schutz vor Inhaltsinjektionen wie XSS deutlich verbessert wird.
- Über
ContentSecurityPolicyMiddleware, dencsp()-Kontextprozessor und die EinstellungSECURE_CSPlassen sich Richtlinien definieren. - Klar definierte und sichere Richtlinienkonfigurationen werden durch Python-Dictionary-basierte Einstellungen unterstützt.
- Über
- Mit
SECURE_CSP_REPORT_ONLYkann ein Überwachungsmodus gesetzt werden. - Es gibt einen Dekorator, mit dem Richtlinien pro View überschrieben oder deaktiviert werden können.
Template Partials
- Tags
partialdefundpartialwurden hinzugefügt, mit denen definierbare Template-Fragmente erstellt und wiederverwendet werden können. - Mit der Syntax
template_name#partial_namekönnenget_template(),render()und{% include %}direkt auf Teile verweisen. - Für Nutzer des Drittanbieterpakets
django-template-partialssteht eine Migrationsanleitung bereit.
Background Tasks Framework
- Django erhält ein eingebautes Framework für die Ausführung asynchroner Aufgaben.
- HTTP-Anfragen und -Antworten werden dabei nicht Teil des Aufrufpfads; E-Mail-Versand oder Datenverarbeitung sind ebenfalls möglich.
- Aufgaben werden mit dem
@task-Dekorator definiert und perenqueue()in die Queue eingereiht.
- Das Backend wird über die Einstellung
TASKSfestgelegt; es sind zwei Standard-Backends für Entwicklung und Test enthalten. - Django übernimmt nur die Erstellung und das Enqueueing von Aufgaben, die Ausführung erfolgt durch externe Worker-Prozesse.
Übernahme der modernen Python-E-Mail-API
- Die E-Mail-Verarbeitung in Django nutzt jetzt die moderne E-Mail-API von Python ab Version 3.6 (
email.message.EmailMessage). - Die bisherigen Klassen
SafeMIMETextundSafeMIMEMultipartsind veraltet. - Der Rückgabetyp von
EmailMessage.message()wurde auf eine Instanz von PythonsEmailMessagegeändert.
Detaillierte Verbesserungen
Admin
- Das Icon-Set Font Awesome Free 6.7.2 wird verwendet.
- Über die Eigenschaft
AdminSite.password_change_formkann das Formular für Passwortänderungen im Adminbereich angepasst werden. - Für
messages.DEBUGundmessages.INFOwurden eigene Icons und CSS-Stile eingeführt.
Auth
- Die Anzahl der Hash-Wiederholungen für PBKDF2 wurde von 1.000.000 auf 1.200.000 erhöht.
GIS
- Die Eigenschaft
GEOSGeometry.hasmerlaubt die Prüfung, ob eine M-Dimension vorhanden ist. - Die Funktion
Rotateunterstützt Rotation um einen angegebenen Winkel. - Über die Eigenschaft
BaseGeometryWidget.base_layerist eine Anpassung der Kartenkachel-Anbieter möglich. - Ab MariaDB 12.0.1 werden
coveredby,isvalid,GeoHashundIsValidunterstützt. - Beim Widget-Rendering wurde Inline-JavaScript entfernt; für Anpassungen ist eine Template-Anpassung erforderlich.
PostgreSQL
- Mit Lexeme-Expressionen wird die Steuerung von Volltext-Suchanfragen verbessert.
- Der Parameter
hintswurde bei Erweiterungsoperationen wieCreateExtensionhinzugefügt. - Für Felder, Indizes und Constraints in
django.contrib.postgreswurden Systemprüfungen ergänzt.
Staticfiles
ManifestStaticFilesStoragesorgt für konsistente Pfadsortierung und reduziert unnötige Diffs.- Der Befehl
collectstaticgibt standardmäßig nur eine Zusammenfassung aus; Detailinformationen werden erst ab--verbosity 2angezeigt.
Sonstiges
- Unterstützung für die Sprache Haitian Creole hinzugefügt.
- Die Kommandos
startprojectundstartapperzeugen nicht vorhandene Verzeichnisse automatisch. - Beim
shell-Befehl werden Standard-Utilities wiedjango.conf.settingsautomatisch importiert. - Migrationen unterstützen die Serialisierung von
zoneinfo.ZoneInfo. - Neue Aggregate-Funktionen wie
StringAggundAnyValuewurden hinzugefügt. - Mit
AsyncPaginatorundAsyncPagesteht asynchrone Pagination zur Verfügung. - In ASGI-Umgebungen wird die Unterstützung für mehrere Cookie-Header in HTTP/2 ergänzt.
- In Templates wurde die Variable
forloop.lengthergänzt und derquerystring-Tag verbessert. DiscoverRunnerunterstützt parallelisierte Tests imforkserver-Modus.
Inkompatible Änderungen
Datenbank-Backend-API
BaseDatabaseSchemaEditorund das PostgreSQL-Backend nutzen bei der Spaltelöschung nicht mehrCASCADE.- Umbenennung von Methoden wie
return_insert_columns()zureturning_columns(). - Bei Unterstützung von
UPDATE … RETURNINGkannDatabaseFeatures.can_return_rows_from_update=Truegesetzt werden.
Eingestellte Unterstützung
- Ende der Unterstützung für MariaDB 10.5 (erforderlich ist 10.6+).
- Ende der Unterstützung für Python < 3.12.
- Mindestversionen wichtiger Bibliotheken:
aiosmtpd 1.4.5,bcrypt 4.1.1,Pillow 10.1.0,psycopg 3.1.12usw.
- Mindestversionen wichtiger Bibliotheken:
- Entfernen der Eigenschaften
mixed_subtype,alternative_subtypeundencoding. - Aufgrund interner Änderungen ist eine Überprüfung von benutzerdefinierten
EmailMessage-Unterklassen erforderlich.
Änderung des Standardwerts von DEFAULT_AUTO_FIELD
- Der Standardwert wurde von
AutoFieldaufBigAutoFieldgeändert. - Projekte, die die Warnung seit Django 3.2 (
models.W042) nicht behoben haben, müssen die Konfiguration ergänzen.
ORM-Ausdrücke
- Die Rückgabeparameter von
as_sql()müssen im Tuple-Format vorliegen.
Sonstiges
- Bei JSON-Serialisierung wird stets ein Zeilenumbruch hinzugefügt.
- Mindestversion von
asgirefauf 3.9.1 angehoben.
In Kürze zu entfernende Funktionen
django.core.mail API
- Bei
get_connection(),send_mail()usw. sollten optionale Argumente nur noch als Schlüsselwortargumente übergeben werden. - Bei der Erstellung von
EmailMessageundEmailMultiAlternativessind nur die ersten vier Argumente positional erlaubt; alle anderen nur als Schlüsselwortargumente.
Sonstiges
BaseDatabaseCreation.create_test_db(serialize)veraltet, verwenden Sieserialize_db_to_string().StringAggundOrderableAggMixinnur für PostgreSQL entfallen.- Das Standardprotokoll von
urlizeundurlizetruncwechselt in Django 7.0 auf HTTPS. ADMINSundMANAGERSmüssen als Liste von E-Mail-Strings angegeben werden, statt als Tupel aus(Name, Adresse).- Entfall von E-Mail-bezogenen Klassen wie
SafeMIMEText,SafeMIMEMultipartundBadHeaderError.
Entfernte Funktionen
- Positionsargument-Unterstützung von
BaseConstraintentfernt. - Entfernung von
DjangoDivFormRendererundJinja2DivFormRenderer. - Entfall der Unterstützung für den Datenbanktreiber
cx_Oracle. - Standard-Schema von
forms.URLField: von"http"auf"https"geändert. - Positionsargumente von
Model.save()undModel.asave()entfernt. ModelAdmin.log_deletion()undLogEntryManager.log_action()entfernt.- Modul
django.utils.itercompatentfernt. - Methoden
GeoIP2.coords()undGeoIP2.open()entfernt. - Entfernen von
ForeignObject.get_joining_columns()und zugehörigen Methoden.
Django 6.0 erhöht durch Sicherheitsverbesserungen, asynchrone Verarbeitung und die Einführung einer modernen E-Mail-API sowohl die Stabilität als auch die Skalierbarkeit des Frameworks und definiert den klaren Übergang auf Python 3.12+.
1 Kommentare
Hacker-News-Kommentare
In einer Organisation, in der ich früher gearbeitet habe, gab es eine „moderne“ Codebasis mit NodeJS+React und eine fast 15 Jahre alte Django-Legacy-App auf Basis von Python 2.7
Anfangs hatte ich Sorge, dass der alte Code schmerzhaft sein würde, aber es war eher das Gegenteil
Die Django-App hat richtig Spaß gemacht, und auch das Aufräumen war wirklich unterhaltsam. Wenn sie irgendwann durch ein neues Go/React-Rewrite ersetzt wird, werde ich das wohl bedauern
Glückwunsch an das Django-Team
Ich pflege seit Langem eine Starter-App auf Basis von Docker Compose mit Django + Celery + Postgres + Redis + esbuild + Tailwind und habe sie kürzlich auf Django 6.0 aktualisiert
Sie ist im GitHub-Repository zu finden
CSP-Konfiguration habe ich bisher noch nicht standardmäßig eingebaut, will das aber nach etwas mehr Prüfung ergänzen
Djangos „batteries included“-Philosophie passt perfekt zu AI-Code-Generierung
Admin-Panel, Login, Passwort-Reset und andere Grundfunktionen sind bereits sauber vorhanden, sodass AI auch mit einer kleinen Codebasis vollständige Websites erstellen kann
Der Code ist klein und klar, daher kann AI ihn auch leicht iterativ verbessern
Statt riesiger Komponenten gibt es klare Modelle und Templates, was auch Reviews von AI-generiertem Code erleichtert
Außerdem existiert Django Admin als unabhängige Ground Truth, sodass man auch dann mit den Daten arbeiten kann, wenn das Frontend kaputtgeht
Schade ist nur, dass das Python-Ökosystem das gevent-Modell nicht übernommen hat. Dann wäre der Wechsel zu Async viel reibungsloser gewesen
Das ist deutlich integrierter als lose gekoppelte Frameworks wie Flask oder FastAPI
Dieser Unterschied reduziert am Ende viele kleine Reibungen (papercuts)
Ich habe eine alte .NET-App neu geschrieben; Rails hat sie fast perfekt konvertiert, während Django damit Schwierigkeiten hatte
Das Feature template partials in diesem Release sieht ziemlich gut aus
Der Stand der Typannotationen (type annotations) ist aber weiterhin unangenehm
django-stubs braucht ein mypy-Plugin, django-types ist ein Fork für pyright, bleibt aber nicht gut synchronisiert
pylance verwendet außerdem noch einen eigenen Fork
Ich hoffe, dass in der nächsten Version wenigstens grundlegende Typen wie HttpRequest, HttpResponse, View und Model offiziell enthalten sind
Dank Django hat Webentwicklung wirklich Spaß gemacht
Selbst wenn ich zu anderen Frameworks wechsle, lande ich am Ende immer wieder bei Django. Eine Entscheidung, die ich nie bereut habe
Auch wenn ich andere Frameworks ausprobiere, komme ich wegen der Bequemlichkeit von Rails immer wieder zurück
Nur dass Rails keine standardmäßige Admin-UI hat, ist etwas schade
Wer einen vollständigen Full-Stack will, sollte sich eher Laravel oder Rails anschauen
Ich mache seit der PHP-Zeit Webentwicklung, und Django fühlte sich für mich immer nur ganz okay an
Django war mein erstes großes Freelance-Projekt, und es fühlt sich für mich immer noch vertraut an
Ich habe viele experimentelle Dinge ausprobiert, und es hat immer gut funktioniert. Danke an Django
Ich nutze Django seit fast 15 Jahren nahezu exklusiv
Ich habe viele andere Frameworks ausprobiert, aber keines hat sich so richtig angefühlt wie Django
In diesem Release wurde zwar ein Task-Framework hinzugefügt, aber schade, dass weder Backend noch Worker enthalten sind
Lieber wäre mir, wenn es in der nächsten Version in vollständiger Form enthalten wäre
Djangos batteries-included-Ansatz macht es unabhängig von der Größe für praktisch jedes Projekt geeignet
Großes Lob an das Team und die Mitwirkenden
Ich frage mich, wie wir eigentlich in das SPA-Zeitalter geraten sind. Wollte man einfach nur Lade-Spinner loswerden, oder gab es tiefere Gründe?
Als Web, iOS und Android ein gemeinsames Backend nutzen sollten, verbreitete sich das SPA-Muster ganz natürlich
Ich baue zwar immer noch SPAs, würde aber irgendwann gern ein großes Projekt mit Django + htmx machen
Dass es sich ohne Seiten-Reload wie eine App anfühlte, war reizvoll, aber in der Praxis brauchte man doch oft einen erzwungenen Reload
Trotzdem halte ich die Trennung von Daten und Darstellung für elegant
Deshalb gab es immer wieder Versuche, Dokumente mit JS in Apps zu verwandeln
Schließlich trennte man Frontend und Backend, und es entstanden API-Verträge und Validierungsprozesse
Später kam wieder der Trend auf, das Ganze mit Server Components zusammenzuführen, und genau an diesem Punkt stehen wir heute
Ein Beispiel für Webformulare alter Schule gibt es unter diesem Link
Deshalb bevorzuge ich heute einen TypeScript-basierten Build-Prozess
Jedes Mal, wenn ich Django nutze, empfinde ich einfach Freude. Das ist alles