Django-de

Django Dokumentation

Bereitstellen statischer Dateien

Diese Dokumentation gilt für Djangos Entwicklerversion, die zum Teil erhebliche Unterschiede zur letzten veröffentlichen Version aufweist.

Django selbst liefert keine statischen Dateien wie Bilder, Stylesheets, Videos oder andere Medien aus. Das überlassen wir dem Webserver deiner Wahl.

Denn Standardwebserver wie Apache und lighttpd sind viel besser auf das Ausliefern von statischen Dateien ausgelegt, als ein Web Framework.

Django unterstützt dennoch das Ausliefern von statischen Dateien während der Entwicklungsphase. Nutze dafür den django.views.static.serve-View.

Der dicke, fette Haftungsausschluss

Diese Methode anzuwenden ist ineffizient und unsicher. Nutze sie nie im Produktivbetrieb! Setze sie nur während der Entwicklung ein.

Für Informationen zum Ausliefern von statischen Dateien in einer Apache Liveumgebung, schau in die Django mod_python Dokumentation

Wie wird’s gemacht

Setze einfach folgende Zeile in deine URLconf:

(r'^site_media/(?P<path>.*)$', 'django.views.static.serve', {'document_root': '/path/to/media'}),

…wobei site_media die URL angibt, unter der deine Medien von außen erreichbar sein werden, und /path/to/media wo sie im Dateisystem zu finden sind.

Du musst document_root übergeben, um auf das Verzeichnis mit den Medien hinzuweisen.

Beispiele:

  • Die Datei /path/to/media/foo.jpg wird über die URL /site_media/foo.jpg verfügbar sein.
  • Die Datei /path/to/media/css/mystyles.css wird über die URL /site_media/css/mystyles.css aufrufbar sein.
  • Die Datei /path/bar.jpg wird nicht zugreifbar sein, da diese nicht im Verzeichnispfad liegt.

Auflisten von Verzeichnissinhalten

Optional kann ein show_indexes-Parameter zum static.serve-View übergeben werden. Dieser ist auf False voreingestellt. Wenn er auf True gesetzt wird, zeigt Django eine Liste aller Dateien innerhalb eines Verzeichnisses an.

Beispiel:

(r'^site_media/(?P<path>.*)$', 'django.views.static.serve', {'document_root': '/path/to/media', 'show_indexes': True}),

Du kannst die Listenansicht verändern, indem du ein Template static/directory_index anlegst. Dieses Template bekommt zwei Objekte in seinen Kontext übergeben:

  • directory — der Name des Verzeichnisses (eine Zeichenkette)

  • file_list — eine Liste mit Dateinamen (als Zeichenketten) innerhalb

    des Verzeichnisses

Hier ist das übliche static/directory_index-Template:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
    <meta http-equiv="Content-type" content="text/html; charset=utf-8" />
    <meta http-equiv="Content-Language" content="en-us" />
    <meta name="robots" content="NONE,NOARCHIVE" />
    <title>Index of {{ directory }}</title>
</head>
<body>
    <h1>Index of {{ directory }}</h1>
    <ul>
    {% for f in file_list %}
    <li><a href="{{ f }}">{{ f }}</a></li>
    {% endfor %}
    </ul>
</body>
</html>

Nutzung auf DEBUG=True einschränken

Da URLconfs einfache Python Module sind, kann man hier auch Python Logik nutzen, um sicher zu stellen, dass der View für statische Dateien nur im Entwicklungsmodus bereit steht. Das ist ein praktischer Trick, damit dieser View nicht aus Versehen in die Produktivumgebung eingreift.

Benutze dafür eine if DEBUG-Anweisung beim django.views.static.serve Eintrag. Hier ist ein volles URLconf Beispiel:

from django.conf.urls.defaults import *
from django.conf import settings

urlpatterns = patterns('',
    (r'^articles/2003/$', 'news.views.special_case_2003'),
    (r'^articles/(?P<year>\d{4})/$', 'news.views.year_archive'),
    (r'^articles/(?P<year>\d{4})/(?P<month>\d{2})/$', 'news.views.month_archive'),
    (r'^articles/(?P<year>\d{4})/(?P<month>\d{2})/(?P<day>\d+)/$', 'news.views.article_detail'),
)

if settings.DEBUG:
    urlpatterns += patterns('',
        (r'^site_media/(?P<path>.*)$', 'django.views.static.serve', {'document_root': '/path/to/media'}),
    )

Dieser Quelltext ist unkompliziert. Er importiert die Einstellungen (aus settings.py) und prüft den Wert von DEBUG. Wenn dieser True ist, wird site_media mit dem django.views.static.serve-View verknüpft. Wenn nicht (DEBUG == False), ist der View nicht erreichbar.

Das heißt natürlich auch, dass du daran denken musst, in Produktivumgebungen die Einstellung DEBUG=False zu setzen. Das solltest du aber ohnehin tun.