Einführung in Django
In diesem ersten Django-Artikel beantworten wir die Frage "Was ist Django?" und geben Ihnen einen Überblick darüber, was dieses Web-Framework besonders macht.
Wir skizzieren die Hauptmerkmale, einschließlich einiger fortgeschrittener Funktionen, die wir in diesem Modul nicht im Detail behandeln können. Außerdem zeigen wir Ihnen einige der wichtigsten Bausteine einer Django-Anwendung (obwohl Sie zu diesem Zeitpunkt noch keine Entwicklungsumgebung haben, in der Sie sie testen können).
Voraussetzungen: | Allgemeines Verständnis der serverseitigen Website-Programmierung und insbesondere der Mechanismen von Client-Server-Interaktionen auf Websites. |
---|---|
Ziel: | Vertrautheit mit Django zu gewinnen, welche Funktionalität es bietet und die Hauptbausteine einer Django-Anwendung kennenzulernen. |
Was ist Django?
Django ist ein hochentwickeltes Python-Web-Framework, das eine schnelle Entwicklung sicherer und wartbarer Websites ermöglicht. Entwickelt von erfahrenen Entwicklern nimmt Django Ihnen viel der Mühe der Web-Entwicklung ab, so dass Sie sich auf das Schreiben Ihrer App konzentrieren können, ohne das Rad neu erfinden zu müssen. Es ist kostenlos und Open Source, hat eine florierende und aktive Community, ausgezeichnete Dokumentation und viele Optionen für kostenlose und kostenpflichtige Unterstützung.
Django hilft Ihnen, Software zu schreiben, die:
- Vollständig ist
-
Django folgt der "Batterien inklusive"-Philosophie und bietet fast alles, was Entwickler "out of the box" tun möchten. Da alles, was Sie brauchen, Teil eines Produkts ist, funktioniert es nahtlos zusammen, folgt konsistenten Designprinzipien und verfügt über umfangreiche und aktuelle Dokumentation.
- Vielseitig
-
Django kann (und wurde) verwendet, um fast jeden Typ von Website zu erstellen – von Content-Management-Systemen und Wikis über soziale Netzwerke bis hin zu Nachrichtenseiten. Es kann mit jedem clientseitigen Framework arbeiten und Inhalte in fast jedem Format liefern (einschließlich HTML, RSS-Feeds, JSON und XML).
Intern bietet es zwar Optionen für fast jede gewünschte Funktionalität (z.B. mehrere beliebte Datenbanken, Vorlagen-Engines usw.), kann aber auch erweitert werden, um bei Bedarf andere Komponenten zu verwenden.
- Sicher
-
Django hilft Entwicklern, viele häufige Sicherheitsfehler zu vermeiden, indem es ein Framework bietet, das darauf ausgelegt ist, die "richtigen Dinge" automatisch zu tun, um die Website zu schützen. Zum Beispiel bietet Django eine sichere Möglichkeit, Benutzerkonten und Passwörter zu verwalten und vermeidet dabei häufige Fehler wie das Ablegen von Sitzungsinformationen in Cookies, wo sie anfällig sind (stattdessen enthalten Cookies nur einen Schlüssel, und die tatsächlichen Daten werden in der Datenbank gespeichert) oder das direkte Speichern von Passwörtern anstelle eines Passwort-Hashes.
Ein Passwort-Hash ist ein festgelegter Längenwert, der durch das Senden des Passworts durch eine kryptografische Hash-Funktion erstellt wird. Django kann überprüfen, ob ein eingegebenes Passwort korrekt ist, indem es es durch die Hash-Funktion sendet und das Ergebnis mit dem gespeicherten Hash-Wert vergleicht. Aufgrund der "Einweg"-Natur der Funktion ist es jedoch auch bei einem kompromittierten Hash-Wert schwierig, das ursprüngliche Passwort zu ermitteln.
Django bietet standardmäßig Schutz gegen viele Schwachstellen, einschließlich SQL-Injection, Cross-Site Scripting, Cross-Site Request Forgery und Clickjacking (siehe Website-Sicherheit für weitere Details zu solchen Angriffen).
- Skalierbar
-
Django verwendet eine komponentenbasierte "Shared-Nothing"-Architektur (jeder Teil der Architektur ist unabhängig von den anderen und kann daher bei Bedarf ersetzt oder geändert werden). Eine klare Trennung der verschiedenen Teile bedeutet, dass es sich für erhöhten Datenverkehr durch Hinzufügen von Hardware auf jeder Ebene skalieren lässt: Caching-Server, Datenbankserver oder Applikationsserver. Einige der meistbesuchten Websites haben Django erfolgreich skaliert, um ihre Anforderungen zu erfüllen (z.B. Instagram und Disqus, um nur zwei zu nennen).
- Wartbar
-
Django-Code wird unter Verwendung von Designprinzipien und -mustern geschrieben, die die Erstellung von wartbarem und wiederverwendbarem Code fördern. Insbesondere nutzt es das Don't Repeat Yourself (DRY)-Prinzip, sodass keine unnötige Duplikation stattfindet, was den Code reduziert. Django fördert auch die Gruppierung verwandter Funktionalität in wiederverwendbare "Anwendungen" und auf niedrigerer Ebene die Gruppierung verwandten Codes in Module (ähnlich dem Model View Controller (MVC)-Muster).
- Portabel
-
Django ist in Python geschrieben, das auf vielen Plattformen läuft. Das bedeutet, dass Sie nicht an eine bestimmte Serverplattform gebunden sind und Ihre Anwendungen auf vielen Linux-Varianten, Windows und macOS ausführen können. Darüber hinaus wird Django von vielen Webhosting-Anbietern gut unterstützt, die häufig spezifische Infrastruktur und Dokumentation für das Hosting von Django-Sites bereitstellen.
Woher kommt Django?
Django wurde ursprünglich zwischen 2003 und 2005 von einem Web-Team entwickelt, das für die Erstellung und Wartung von Zeitungswebsites verantwortlich war. Nach der Erstellung einer Reihe von Websites begann das Team, viel gemeinsamen Code und Designmuster herauszufiltern und wiederzuverwenden. Dieser gemeinsame Code entwickelte sich zu einem generischen Web-Entwicklungs-Framework, das im Juli 2005 als "Django"-Projekt veröffentlicht wurde.
Django hat sich stetig weiterentwickelt und verbessert, von seiner ersten Meilenstein-Version (1.0) im September 2008 bis zur Version 5.0 Ende 2023. Jede Veröffentlichung brachte neue Funktionalitäten und Fehlerbehebungen, von der Unterstützung neuer Datenbanktypen, Template-Engines und Caching bis hin zur Hinzufügung von "generischen" View-Funktionen und -Klassen (die die Menge an Code reduzieren, die Entwickler für eine Reihe von Programmieraufgaben schreiben müssen).
Hinweis: Sehen Sie sich die Veröffentlichungshinweise auf der Django-Website an, um zu sehen, was sich in den letzten Versionen geändert hat und wie viel Arbeit in die Verbesserung von Django gesteckt wird.
Django ist jetzt ein florierendes, kollaboratives Open-Source-Projekt mit vielen Tausenden von Benutzern und Mitwirkenden. Während es immer noch einige Funktionen hat, die seine Herkunft widerspiegeln, hat sich Django zu einem vielseitigen Framework entwickelt, das in der Lage ist, jede Art von Website zu entwickeln.
Wie populär ist Django?
Es gibt keine leicht verfügbaren und endgültigen Messungen der Beliebtheit von serverseitigen Frameworks (obwohl man die Beliebtheit durch Mechanismen wie das Zählen der Anzahl von GitHub-Projekten und Stack Overflow-Fragen für jede Plattform abschätzen kann). Eine bessere Frage ist, ob Django "beliebt genug" ist, um die Probleme unbeliebter Plattformen zu vermeiden. Entwickelt es sich weiter? Können Sie Hilfe bekommen, wenn Sie sie brauchen? Gibt es eine Gelegenheit für Sie, bezahlte Arbeit zu bekommen, wenn Sie Django lernen?
Basierend auf der Anzahl hochkarätiger Websites, die Django verwenden, der Anzahl der Personen, die zum Codebasis beitragen, und der Anzahl der Personen, die sowohl kostenlose als auch kostenpflichtige Unterstützung bieten, dann ja, Django ist ein beliebtes Framework!
Hochkarätige Websites, die Django nutzen, sind: Disqus, Instagram, Knight Foundation, MacArthur Foundation, Mozilla, National Geographic, Open Knowledge Foundation, Pinterest und Open Stack (Quelle: Django-Übersichtsseite).
Ist Django "Opinionated"?
Web-Frameworks bezeichnen sich oft als "opinionated" oder "unopinionated".
Opinionated-Frameworks sind solche, die Meinungen darüber haben, wie man eine bestimmte Aufgabe "richtig" erledigt. Sie unterstützen oft eine schnelle Entwicklung in einem bestimmten Bereich (Lösung von Problemen eines bestimmten Typs), weil der richtige Weg, etwas zu tun, in der Regel gut verstanden und dokumentiert ist. Sie können jedoch weniger flexibel darin sein, Probleme außerhalb ihres Hauptbereichs zu lösen, und neigen dazu, weniger Auswahlmöglichkeiten für die verwendeten Komponenten und Ansätze zu bieten.
Unopinionated-Frameworks haben im Gegensatz dazu viel weniger Einschränkungen darüber, was der beste Weg ist, Komponenten zusammenzufügen, um ein Ziel zu erreichen, oder welche Komponenten verwendet werden sollen. Sie erleichtern es Entwicklern, die am besten geeigneten Werkzeuge zu verwenden, um eine bestimmte Aufgabe zu erledigen, allerdings auf Kosten dessen, dass Sie diese Komponenten selbst finden müssen.
Django ist "etwas opinionated" und bietet daher das "Beste aus beiden Welten". Es bietet eine Reihe von Komponenten zur Bearbeitung der meisten Webentwicklungsaufgaben und eine (oder zwei) bevorzugte Methoden zur Verwendung derselben. Djangos entkoppelte Architektur bedeutet jedoch, dass Sie in der Regel aus einer Reihe verschiedener Optionen auswählen oder bei Bedarf Unterstützung für völlig neue Optionen hinzufügen können.
Wie sieht Django-Code aus?
In einer traditionellen datengesteuerten Website wartet eine Webanwendung auf HTTP-Anforderungen des Webbrowsers (oder eines anderen Clients). Wenn eine Anforderung empfangen wird, arbeitet die Anwendung heraus, was benötigt wird, basierend auf der URL und möglicherweise Informationen in POST
-Daten oder GET
-Daten. Je nachdem, was erforderlich ist, kann sie dann Informationen aus einer Datenbank lesen oder schreiben oder andere Aufgaben ausführen, die zur Erfüllung der Anforderung erforderlich sind. Die Anwendung gibt dann eine Antwort an den Webbrowser zurück, indem sie oft dynamisch eine HTML-Seite für den Browser erstellt, indem sie die abgerufenen Daten in Platzhalter in einer HTML-Vorlage einfügt.
Django-Webanwendungen gruppieren den Code, der jeden dieser Schritte verarbeitet, typischerweise in separate Dateien:
- URLs: Während es möglich ist, Anforderungen von jeder einzelnen URL über eine einzelne Funktion zu verarbeiten, ist es viel wartbarer, eine separate View-Funktion zu schreiben, um jede Ressource zu verarbeiten. Ein URL-Mapper wird verwendet, um HTTP-Anforderungen basierend auf der Anforderungs-URL an die entsprechende View umzuleiten. Der URL-Mapper kann auch bestimmte Muster von Zeichenfolgen oder Ziffern erkennen, die in einer URL erscheinen, und diese als Daten an eine View-Funktion übergeben.
- View: Eine View ist eine Anforderungsverarbeitungsfunktion, die HTTP-Anforderungen empfängt und HTTP-Antworten zurückgibt. Views greifen über Modelle auf die zur Befriedigung von Anforderungen benötigten Daten zu und überlassen das Formatieren der Antwort den Vorlagen.
- Modelle: Modelle sind Python-Objekte, die die Struktur der Daten einer Anwendung definieren und Mechanismen zum Verwalten (Hinzufügen, Ändern, Löschen) und Abfragen von Datensätzen in der Datenbank bereitstellen.
- Vorlagen: Eine Vorlage ist eine Textdatei, die die Struktur oder das Layout einer Datei definiert (z.B. einer HTML-Seite), mit Platzhaltern, die tatsächlichen Inhalt darstellen. Eine View kann eine HTML-Seite dynamisch erstellen, indem sie eine HTML-Vorlage verwendet und diese mit Daten aus einem Modell füllt. Eine Vorlage kann verwendet werden, um die Struktur eines beliebigen Dateityps zu definieren; es muss nicht HTML sein!
Hinweis: Django bezeichnet diese Organisation als "Model View Template (MVT)"-Architektur. Es gibt viele Ähnlichkeiten mit der bekannteren Model View Controller-Architektur.
Die folgenden Abschnitte geben Ihnen eine Vorstellung davon, wie diese Hauptteile einer Django-App aussehen (wir werden später im Kurs, sobald wir eine Entwicklungsumgebung eingerichtet haben, mehr ins Detail gehen).
Senden der Anfrage an die richtige Ansicht (urls.py)
Ein URL-Mapper wird typischerweise in einer Datei namens urls.py gespeichert.
Im untenstehenden Beispiel definiert der Mapper (urlpatterns
) eine Liste von Zuordnungen zwischen Routen (spezifische URL-Muster) und den entsprechenden View-Funktionen.
Wenn eine HTTP-Anforderung empfangen wird, die eine URL hat, die einem bestimmten Muster entspricht, wird die zugehörige View-Funktion aufgerufen und die Anforderung übergeben.
urlpatterns = [
path('admin/', admin.site.urls),
path('book/<int:id>/', views.book_detail, name='book_detail'),
path('catalog/', include('catalog.urls')),
re_path(r'^([0-9]+)/