Ein Blog

30 Artikel

Umgang mit "Static Files" im Django Web Framework

Ein Web Framework, wie Django dient unter anderem dazu, Webinhalte dynamisch, d.h. basierend auf Eingaben vom Nutzer und Daten aus einer Datenbank zu generieren. Im Unterschied dazu sind einige Webseiten statisch, d.h. der gesamte Inhalt ist in Daten (z.B. HTML, CSS) festgeschrieben und ändert sich nur, wenn diese Dateien durch den Webseitenbesitzer/Entwickler angepasst werden. Nun gibt es aber auch bei "dynamischen" Webseiten Elemente, die in sich nie (oder sehr selten) verändert werden müssen. Bilder auf einer Webseite verändern sich in sich, d.h. die Datei selbst eigentlich nie. Ja, ein Bild kann gegen ein anderes ausgetauscht werden, aber dass eine Bilddatei in sich geändert wird, wird man kaum vorfinden. Auch die grundlegende visuelle Gestaltung (Layout) einer Webseite wird häufig übergreifend in sich selten ändernden CSS Dateien festgelegt.

Somit muss also auch bei Django festgelegt werden, wie Anfragen (durch den Browser des Webseitennutzers) zu statischen Files bedient werden sollen und wo sie zu finden sind, d.h. eine Zuordnung von (1) URL Aufrufen zu (2) Dateien auf dem "Webserver".

Für (1) findet man bei Django bereits direkt nach der Installation einen Eintrag in der "settings.py"-Datei.

STATIC_URL = '/static/' gibt an, dass Anfragen auf URLs, die mit /static/ beginnen, als Anfragen für statische Dateien behandelt werden sollen. (z.B. "https://www.meinewebseite.de/static/einbild.jpg")

Punkt (2) benötigt etwas mehr Hintergrundwissen. Django ist ja unter anderem dafür bekannt, dass es sehr unterstützend dabei ist, dass man schnell stabile Anwendungen entwickeln kann. Und dafür bietet es manchmal Dinge (an), die oftmals als "Django Magic" bezeichnet, aber damit auch nicht unbedingt sofort zu verstehen oder offensichtlich sind.

Die Antwort auf Punkt (2), "Wo finden sich die statischen Dateien auf dem Server?", beantwortet sich Django, solange man den Entwicklungsserver über "python manage.py runserver" nutzt, nämlich selbst. Erfolgt ein Aufruf einer /static/ - URL sucht Django in allen Ordner der genutzten "Apps" nach einem Unterordner "static". Sofern man also seine statischen Dateien in einem solchen Unterordner anlegt, werden diese Dateien auch gefunden und vom Entwicklungsserver bedient.

Möchte man diese Suche manuell erweitern, weil man (weitere) Unterordner an anderer Stelle platzieren oder anders benennen möchte. Kann man über dies Django mit einem weiteren Eintrag in der "settings.py"-Datei mitteilen.

Mit STATICFILES_DIRS = [] kann man eine Liste von Ordnernamen angeben, die Django als Ordner mit statischen Dateien betrachten soll. Am Besten gibt man hier nicht feste Pfade an, sondern nutzt betriebssystemübergreifende Angaben, STATICFILES_DIRS = [os.path.join(BASE_DIR, "")].

Nun ist der Entwicklungsserver genau das, wie man ihn bezeichnet, ein Server für die Zeit der Entwicklung. Für einen produktiven Einsatz, d.h. für den Betrieb auf einen von anderen Personen zugreifbaren Rechner ist er nicht geeignet. Er ist für viele ggf. parallele Zugriffe einfach nicht ausgelegt.

Dafür gibt es Webserver wie Apache oder Nginx. Sollte man besonders große Dateien (z.B. Videos) anbieten wollen, nutzt man vielleicht sogar ein CDN (Content Delivery Network). Egal wie man sich entscheidet, Django selbst ist nicht geeignet Anfragen an statische Dateien im produktiven Einsatz zu bedienen. Daher muss man alle statischen Dateien sammeln und einem der eben genannten Möglichkeit (Webserver, CDN) geordnet übergeben.

Aber auch hierfür bietet Django natürlich ein Helferlein. Mit dem Befehl "python manage.py collectstatic" sucht Django ebenfalls nach den statischen Dateien, nur diesmal um sie an einen gemeinsamen Ort zu kopieren. Wohin genau werden die Dateien gesammelt?

An den Ort, den man mit dem letzten hier zu erwähnenden Eintrag in der "settings.py" festlegt.

STATIC_ROOT = os.path.join(BASE_DIR, "")

Mit diesen drei Einträgen sind alle Einstellungen so, wie man sie selbst haben möchte und im produktiven Betrieb können die statischen Dateien auf die gewünschte Art bedient werden.

Zu guter Letzt soll aber noch gezeigt werden, dass man statische Dateien innerhalb der HTML-Templates natürlich auch dynamisch verlinken kann.

Mit <link href="/static/css/mein.css" rel="stylesheet"> liegt der Pfad fest.

Django bietet aber die Möglichkeit in ein HTML Template den Pfad für die statischen Dateien verfügbar zu machen.

{% load static %} macht es möglich, innerhalb der HTML-Datei "relativ" auf statische Dateien zu verweisen. Das obere Bespiel sieht damit so aus:

<link href="{% static 'css/mein.css' %}" rel="stylesheet">

Wirkt nicht groß anders, macht aber den Unterschied, dass wir die statischen Files bzw. die zugehörigen Ordner jederzeit verschieben oder umbenennen können und sie dennoch auf Basis der Angaben in der "settings.py" auf hier im HTML-Template gefunden werden.

mathiasmell 22. Februar 2019 09:55 django

0 Kommentare

  • Bisher noch keine Kommentare zum Beitrag. Sei der Erste!