- Django 6.0 feiert das 20-jährige Bestehen des Frameworks und ist ein bedeutendes Release mit umfangreichen Verbesserungen in zentralen Bereichen wie Templates, Hintergrundaufgaben, Sicherheit und E-Mail-Verarbeitung.
- Mit Template partials ist die Codewiederverwendung in Templates deutlich einfacher geworden und die Integration mit Tools wie htmx wurde verbessert.
- Ein neues Tasks Framework wurde eingeführt, um Hintergrundaufgaben außerhalb des HTTP-Anfrageantwort-Zyklus auszuführen.
- Mit der eingebauten Content Security Policy (CSP)-Unterstützung wird der Schutz vor Content-Injection-Angriffen wie XSS deutlich vereinfacht.
- Durch die Modernisierung der E-Mail-API, ORM-Optimierungen und die Erweiterung des Primärschlüssels wurden die Entwicklererfahrung und Skalierbarkeit stark verbessert.
Überblick zu Django 6.0
- Django 6.0 ist eine neue Version des Python-Webframeworks und setzt 20 Jahre Entwicklung fort.
- Die wichtigsten Änderungen konzentrieren sich auf vier Kernbereiche: Templates, Hintergrundaufgaben, Sicherheit und E-Mail-Verarbeitung.
- Die Veröffentlichung basiert auf Beiträgen zahlreicher Community-Mitwirkender und den zentralen Verbesserungen aus den offiziellen Release Notes.
Das django-upgrade-Tool
- Beim Upgrade bestehender Projekte von Django 5.2 oder älter kann das django-upgrade-Tool für eine automatische Codeumstellung genutzt werden.
- Django 6.0 enthält fünf automatische Fixer und behebt so einige Warnungen automatisch.
Template partials
- Das neue Feature Template-Teildefinition (
{% partialdef %}) reduziert Duplikate im Template-Code und verbessert die Wiederverwendbarkeit.
- Ein im selben Template definiertes Partial kann mehrfach aufgerufen werden.
- Mit der Option
inline kann die Definition direkt beim Rendern erfolgen.
- Über Teil-Rendering kann nur ein bestimmter Partial unabhängig gerendert werden.
- Im Beispiel wird der Abschnitt
view_count mit htmx periodisch aktualisiert.
- Durch Anhängen von
#partial_name an die URL lässt sich nur ein bestimmter Teil rendern.
- Dieses Feature wurde über das Google Summer of Code-Projekt in Django integriert und basiert auf dem bisherigen Paket
django-template-partials.
Tasks Framework
- Django erhält ein neues Task-Framework für die Ausführung von Hintergrundaufgaben.
- Code kann außerhalb des HTTP-Anfrageantwort-Zyklus ausgeführt werden.
- Einsatzmöglichkeiten sind etwa E-Mails senden, Daten verarbeiten oder Berichte erstellen.
- Aufgaben werden mit dem
@task-Decorator definiert und über Task.enqueue() in eine Queue eingereiht.
- Standardmäßig stehen zwei Backends zur Verfügung:
ImmediateBackend und DummyBackend für die Entwicklung.
- Für django-tasks-Pakete kann mit
DatabaseBackend eine Ausführung auf Basis einer SQL-Datenbank genutzt werden.
- Mit dem Befehl
db_worker wird ein Task-Worker gestartet; der Fortschritt ist über Logs einsehbar.
- Die Idee stammt aus Wagtail und wurde nach dem Vorschlag DEP 0014 in Django übernommen.
Support für Content Security Policy (CSP)
- Django 6.0 unterstützt den CSP-Standard nativ, wodurch der Schutz vor Content-Injection-Angriffen wie XSS deutlich verbessert wird.
- Durch Hinzufügen von
ContentSecurityPolicyMiddleware zu MIDDLEWARE wird CSP aktiviert.
- Die Einstellungen
SECURE_CSP und SECURE_CSP_REPORT_ONLY ermöglichen die Konfiguration von Richtlinien.
- Durch nonce-basierte Sicherheit kann bei
<script>- und <style>-Tags automatisch nonce="{{ csp_nonce }}" gesetzt werden.
- Für jede Anfrage wird ein zufälliger Nonce erzeugt, sodass nur vertrauenswürdige Ressourcen ausgeführt werden.
- CSP wurde nach einem Vorschlag von 2004 über das Paket
django-csp umgesetzt und ist mit dieser Version nun offiziell integriert.
Update der E-Mail-API
- Die E-Mail-Verarbeitung in Django wurde auf eine moderne Python-3.6-E-Mail-API umgestellt.
- Intern kommt dabei die Klasse
email.message.EmailMessage zum Einsatz.
- Bestehende
send_mail()- und EmailMessage-Schnittstellen bleiben erhalten.
- Die neue API reduziert Fehler, verbessert die Sicherheit und verbessert die Verarbeitung von Inline-Anhängen.
- Mit dem Objekt
MIMEPart lassen sich Inline-Anhänge wie Bilder in HTML-Inhalten einfach hinzufügen.
- Diese Änderung wurde 2024 vorgeschlagen und nach acht Monaten Entwicklung zusammengeführt.
Einschränkung von Positionsargumenten in der E-Mail-API
- In der
django.core.mail-API wurden einige Parameter auf nur benannte Argumente (Keyword-Only) umgestellt.
- Wird ein optionales Argument wie
fail_silently als Positionsargument übergeben, erscheint eine Warnung.
- Das dient der besseren Lesbarkeit und Wartbarkeit.
- Das
mail_api_kwargs-Fixer-Tool von django-upgrade kann die Anpassung automatisch übernehmen.
Erweiterter automatischer Import in der Shell
- Die automatische Modellimport-Funktion aus Django 5.2 wurde erweitert, sodass jetzt auch
settings, connection, models, functions und timezone automatisch importiert werden.
- Mit
./manage.py shell -v 2 lässt sich die Liste der automatisch importierten Module anzeigen.
- Dadurch verbessert sich die Entwicklerfreundlichkeit und wiederholender Code wird reduziert.
ORM-Verbesserung: Dynamische Feldaktualisierung nach save()
GeneratedField- und ausdrucksbasierte Felder werden nach einem save() automatisch aktualisiert.
- In Datenbanken mit
RETURNING-Unterstützung (SQLite, PostgreSQL, Oracle) geschieht das sofort.
- In MySQL und MariaDB erfolgt die Aktualisierung per Lazy Loading.
- Damit lassen sich aktuelle Werte sofort nutzen, ohne zusätzliche Abfragen zu senden.
Universelle StringAgg-Aggregatfunktion
- Die
StringAgg-Aggregate ist jetzt auf allen Datenbank-Backends verfügbar.
- Sie gibt einen String mit Trennzeichen (
delimiter) als Verbindung der Eingabewerte zurück.
- Die Funktion war zuvor auf PostgreSQL beschränkt, kann jetzt aber direkt aus
django.db.models genutzt werden.
- Der Trennzeichenwert lässt sich mit dem Ausdruck
Value() angeben.
BigAutoField als Standard
- Der Standardwert von
DEFAULT_AUTO_FIELD wurde auf BigAutoField geändert.
- Durch 64-Bit-Ganzzahl-Primärschlüssel wird das Risiko von Primärschlüsselengpässen reduziert.
- In neuen Projekten wird dies automatisch angewendet.
- Die Konfiguration, die in Django 3.2 eingeführt wurde, wurde vereinfacht, wodurch weniger Boilerplate-Code nötig ist.
Template-Verbesserungen
- Die Variable
forloop.length wurde ergänzt, sodass die Gesamtlänge einer Schleife direkt abrufbar ist.
- Einsatzbeispiel:
{{ forloop.counter }}/{{ forloop.length }}
- Verbesserungen am
querystring-Template-Tag.
- Bei leerem Mapping wird automatisch
? ergänzt, damit sich Links konsistent verhalten.
- Die Kombination mehrerer Mapping-Argumente wird unterstützt, wodurch Query-Parameter leichter zusammengesetzt werden können.
Abschluss
- An Django 6.0 haben 174 Mitwirkende teilgenommen.
- Außerdem sind zahlreiche Optimierungen und Fehlerbehebungen enthalten.
- Das Upgrade verbessert übergreifend Sicherheit, Wartbarkeit und Entwicklererfahrung (DX).
- Zusätzliche Änderungen sind in den offiziellen Release Notes dokumentiert.
Noch keine Kommentare.