Request- und Response-Objekte
Diese Dokumentation gilt für Djangos Entwicklerversion, die zum Teil erhebliche Unterschiede zur letzten veröffentlichen Version aufweist.
Kurzübersicht
Django verwendet Request- und Response-Objekte, um Statusinformationen durch das System zu reichen.
Wenn eine Seite angefordert wird, generiert Django ein HttpRequest-Objekt, das Metadaten über diesen enthält. Anschließend lädt Django die dazugehörige View und übergibt den HttpRequest als erstes Argument an die View-Function. Jede View ist selbst dafür verantwortlich, ein HttpResponse-Objekt zurückzugeben.
Dieses Dokument beschreibt im Weiteren die APIs der HttpRequest und HttpResponse-Objekte.
HttpRequest-Objekte
Attribute
Alle Attribute außer session sollten als schreibgeschützt angesehen werden.
- path
Ein String, der den vollständigen Pfad zu der angeforderten Seite enthält, allerdings ohne Domain-Namen.
Beispiel: "/music/bands/the_beatles/"
- method
Ein String, der die HTTP-Methode des Requests enthält. Dieser wird stets mit Großbuchstaben geschrieben. Beispiel:
if request.method == 'GET': tue_etwas() elif request.method == 'POST': tue_etwas_anderes()- encoding
Neu in Djangos Entwicklerversion
Ein String, der das aktuelle Encoding repräsentiert, um Formulardaten einer Eingabe zu dekodieren (oder None; es wird dann die DEFAULT_CHARSET-Einstellung verwendet). Du kannst dieses Attribut überschreiben, um das Encoding für den Zugriff auf die Formulardaten zu ändern. Jeder spätere Attribut-Zugriff (wie das Lesen von GET oder POST) wird dann diesen neuen encoding-Wert verwenden. Das ist nützlich, wenn man sicher weiss, dass die Formulardaten nicht im DEFAULT_CHARSET Encoding kodiert sind.
- GET
- Ein Objekt, das dem Dictionary ähnlich ist und alle übergebenen HTTP GET-Parameter enthält. Siehe die QueryDict-Dokumentation weiter unten.
- POST
Ein Objekt, das dem Dictionary ähnlich ist und alle übergebenen HTTP POST-Parameter enthält. Siehe die QueryDict-Dokumentation weiter unten.
Es ist möglich, dass ein POST-Request mit leerem POST-Dictionary übergeben wird — falls ein Formular über die HTTP-POST-Methode angefordert wird, es aber keine Formulardaten enthält. Deshalb solltest du if request.POST nicht dazu verwenden, um zu prüfen, ob die POST-Methode verwendet wird; bitte verwende ìf request.method == "POST" (siehe oben).
Bemerke: POST enthält keine Datei-Upload-Information. Siehe dazu FILES.
- REQUEST
Einem dem Dictionary ähnlichem Objekt für den vereinfachten Zugriff, das zuerst POST und dann GET auswertet. Inspiriert von $_REQUEST bei PHP.
Zum Beispiel, wenn GET = {"name": "john"} und POST = {"age": '34'}, REQUEST["name"] würde dann "john" und REQUEST["age"] würde "34" zurückgeben.
Es wird dringend empfohlen GET und POST anstatt REQUEST zu verwenden, da es eindeutiger ist.
- COOKIES
- Ein Standard Python Dictionary, das alle Cookies enthält. Schlüssel und Werte sind Strings.
- FILES
Ein dem Dictionary ähnlichem Objekt, das alle hochgeladenen Dateien enthält. Jeder Schlüssel in FILES entspricht dem name von <input type="file" name="" />. Jeder Wert in FILES ist ein Standard Python Dictionary mit den folgenden Schlüsseln:
- filename — Der Name der hochgeladenen Datei als Python-String.
- content-type — Der Inhaltstyp der hochgeladenen Datei.
- content — Der unverarbeite Inhalt der hochgeladenen Datei.
Beachte, dass FILES nur mit Inhalt gefüllt ist, falls die Request-Methode POST war und dass das absendede <form> (Formular) als enctype="multipart/form-data" definiert wurde. Andernfalls ist FILES` ein leeres Dictionary-ähnliches Objekt.
- META
Ein Standard Python Dictionary, das alle verfügbaren HTTP-Kopfdaten (Headers) enthält. Verfügbare Kopfdaten sind abhängig von Client und Server. Hier aber mal einige Beispiele:
- CONTENT_LENGTH
- CONTENT_TYPE
- HTTP_ACCEPT_ENCODING
- HTTP_ACCEPT_LANGUAGE
- HTTP_HOST — Der HTTP-Host, der vom Client gesendet wurde.
- HTTP_REFERER — Die verweisende Seite, falls bekannt.
- HTTP_USER_AGENT — Der User-Agent-String (Browser-Typ) des Clients.
- QUERY_STRING — Der Abfrage-String als einfacher (nicht-analysierter) String.
- REMOTE_ADDR — Die IP-Adresse des Clients.
- REMOTE_HOST — Der Hostname des Clients.
- REQUEST_METHOD — Ein String wie z.B. "GET" oder "POST".
- SERVER_NAME — Der Hostname des Servers.
- SERVER_PORT — Der verwendete Port des Servers.
- user
Ein django.contrib.auth.models.User-Objekt, dass den aktuell angemeldeten Benutzer repräsentiert. Falls der Benutzer im Moment nicht angemeldet ist, nimmt user eine Instanz von django.contrib.auth.models.AnonymousUser an. Man kann den Status mit Hilfe von is_authenticated() folgendermassen abfragen:
if request.user.is_authenticated(): # Do something for logged-in users. else: # Do something for anonymous users.user ist erst verfügbar, wenn in Deiner Django-Installation AuthenticationMiddleware aktiviert ist. Für nähere Information siehe Authentifizierung bei Web-Requests.
- session
- Ein les- und schreibbares Dictionary-ähnliches Objekt, das die aktuelle Session repräsentiert. Diese ist nur verfügbar, wenn Session-Unterstützung in deiner Django-Installation aktiviert wurde. Siehe die Session Dokumentation für weitere Details.
- raw_post_data
- Die unverarbeiteten HTTP-POST-Daten. Diese sind lediglich bei erweiterter Verarbeitung nützlich. Verwende lieber POST.
Methoden
- __getitem__(key)
Gibt den GET/POST-Wert für den übergebenen Schlüssel zurück. Es wird erst POST, dann GET überprüft. Wirft einen KeyError, falls der Schlüssel nicht existiert.
Das lässt dich die HttpRequest-Instanz per Dictionary-Syntax verwenden. Beispiel request["foo"] würde True zurückliefern, wenn entweder request.POST oder request.GET einen foo-Schlüssel besitzt.
- has_key(key)
- Gibt True oder False zurück, wenn entweder request.GET oder request.POST den übergebenen Schlüssel besitzt.
- get_host()
Neu in Djangos Entwicklerversion
Gibt den Ursprungs-Hostnamen des Requests zurück, wobei die Information aus den Kopfdaten HTTP_X_FORWARDED_HOST und HTTP_POST geholt werden (genau in dieser Reihenfolge). Falls beide leer sein sollten, verwendet diese Methode eine Kombination aus SERVER_NAME und SERVER_PORT, wie es detailliert in PEP 333 beschrieben wird.
Beispiel: "127.0.0.1:8000"
- get_full_path()
Gibt den Pfad und, falls verfügbar, einen angehängten Abfrage-String zurück.
Beispiel: "/music/bands/the_beatles/?print=true"
- build_absolute_uri(location)
Neu in Djangos Entwicklerversion
Gibt die vollständige URI von location zurück. Sofern keine Location vorhanden, wird die Location auf request.get_full_path() gesetzt.
Falls die Location bereits eine vollständige URI ist, wird sie nicht verändert. Andernfalls wird die vollständige URI aus den verfügbaren Server-Variablen zusammengebaut.
Beispiel: "http://example.com/music/bands/the_beatles/?print=true"
- is_secure()
- Gibt True zurück, falls der Request sicher ist; das bedeutet, dass dieser per HTTPS gemacht wurde.
QueryDict-Objekte
In einem HttpRequest-Objekt sind die GET- und POST-Attribute Instanzen von django.http.QueryDict. QueryDict ist dem Dictionary ähnlich, allerdings daran angepasst, um mit mehreren Werten für den gleichen Schlüssel umzugehen. Das ist notwendig, da einige HTML-Formular-Elemente, besonders <select multiple="multiple">, mehrere Werte für den gleichen Schlüssel übergeben.
QueryDict-Instanzen sind unveränderlich, es sei denn du machst eine copy() (Kopie) von ihnen. Das bedeutet, du kannst die Attribute von request.POST und request.GET nicht direkt verändern.
QueryDict implementiert alle Standard Dictionary-Methoden, da es eine Unterklasse von Dictionary ist. Ausnahmen werden hier näher behandelt:
__getitem__(key) — gibt den Wert für den gegebenen Schlüssel (key) zurück. Falls der Schlüssel mehr als einen Wert liefert, gibt __getitem__() den letzten Wert zurück. Sie wirft den Fehler django.utils.datastructure.MultiValueDictKeyError, falls der Schlüssel nicht existiert. (Das ist eine Unterklasse des Standard KeyError von Python. Somit kannst du dabei bleiben, den Fehler KeyError zu fangen.)
__setitem__(key, value) — Setzt den gegebenen Wert auf [value] (eine Python-Liste, dessen einziges Element value ist). Bitte beachte, dass diese Funktion nur auf veränderebare QueryDict-Objekte anwendbar ist (welches mit Hilfe von copy() erstellt wurde).
__contains__(key) — Gibt True zurück, falls der gegebene Wert gesetzt ist. Das ermöglicht dir z.B. if "foo" in request.GET.
get(key, default) — Verwendet die selbe Logik, wie __getitem__() weiter oben, nur mit der Möglichkeit, einen Default-Wert zurückzugeben, falls der Schlüssel nicht existiert.
has_key(key)
setdefault(key, default) — Wie die Standard Dictionary setdefault()-Methode, außer dass sie intern __setitem__ verwendet.
update(other_dict) — Nimmt entweder ein QueryDict oder ein Standard Dictionary entgegen. Verhält sich wie die Standard Dictionary update()-Methode, nur mit dem Unterschied, dass sie an die aktuellen Dictionary-Elemente anhängt anstatt diese zu ersetzen. Zum Beispiel:
>>> q = QueryDict('a=1') >>> q = q.copy() # mach das Objekt veränderbar >>> q.update({'a': '2'}) >>> q.getlist('a') ['1', '2'] >>> q['a'] # gibt den letzten Wert zurück ['2']items() — Wie die Standard Dictionary items() Methode, nur dass sie die selbe Letzer-Wert-Logik verwendet wie in __getitem()__. Zum Beispiel:
>>> q = QueryDict('a=1&a=2&a=3') >>> q.items() [('a', '3')]values() — Wie die Standard Dictionary values() Methode, nur dass sie die selbe Letzter-Wert-Logik verwendet wie __getitem()__. Zum Beispiel:
>>> q = QueryDict('a=1&a=2&a=3') >>> q.values() ['3']
Zusätzlich hat QueryDict die folgenden Methoden:
copy() — Gibt die Kopie des Objektes zurück und verwendet copy.deepcopy() aus der Python Standard Bibliothek. Die Kopie wird dann veränderbar sein — das bedeutet, dass du dann seine Werte verändern kannst.
getlist(key) — Gibt die Daten anhand des angeforderten Schlüssels als Python-Liste zurück. Eine leere Liste wird zurückgegeben, falls der Schlüssel nicht existiert. Es wird stets gewährleistet, dass eine Liste zurückgeliefert wird.
setlist(key, list_) — Setzt den angegebenen Schlüssel auf list_ (im Gegensatz zu __setitem__()).
appendlist(key, item) — Fügt ein Element der internen Liste an, das diesem Schlüssel zugehörig ist.
setlistdefault(key, default_list) — Ähnlich wie setdefault, außer dass es eine Liste von Werten anstatt eines einzelnen Wertes annimmt.
lists() — Wie items(), außer dass es alle Werte, als Liste, für jedes Element des Dictionary, beinhaltet. Zum Beispiel:
>>> q = QueryDict('a=1&a=2&a=3') >>> q.lists() [('a', ['1', '2', '3'])]urlencode() — Gibt die Daten als Abfrage-String zurück. Beispiel: "a=2&b=3&b=5".
Beispiele
Hier ein Beispiel eines HTML-Formulars und wie Django die Eingabe behandeln würde:
<form action="/foo/bar/" method="post">
<input type="text" name="your_name" />
<select multiple="multiple" name="bands">
<option value="beatles">The Beatles</option>
<option value="who">The Who</option>
<option value="zombies">The Zombies</option>
</select>
<input type="submit" />
</form>
Falls der Benutzer "John Smith" im Feld your_name eingeben hätte und die beiden Selektionen “The Beatles” und “The Zombies” in der Mehrfach-Select-Box gewählt hätte, dann würde Djangos Request-Objekt folgendermassen aussehen:
>>> request.GET
{}
>>> request.POST
{'your_name': ['John Smith'], 'bands': ['beatles', 'zombies']}
>>> request.POST['your_name']
'John Smith'
>>> request.POST['bands']
'zombies'
>>> request.POST.getlist('bands')
['beatles', 'zombies']
>>> request.POST.get('your_name', 'Adrian')
'John Smith'
>>> request.POST.get('nicht_existierendes_feld', 'Nowhere Man')
'Nowhere Man'
Bemerkungen über die Implementierung
Die GET, POST, COOKIES, FILES, META, REQUEST, raw_post_data und user Attribute werden alle erst bei Bedarf geladen (lazy). Das bedeutet, dass Django keine Ressourcen zur Berechnung der Werte dieser Attribute verbraucht, bis diese von deinem Code angefordert werden.
HttpResponse-Objekte
Im Gegensatz zu HttpRequest Objekten, die automatisch von Django erstellt werden, trägst du für HttpResponse Objekte selbst die Verantwortung. Jede View, die du schreibst, ist dafür verantwortlich ein HttpResponse-Objekt zu instanziieren, zu bestücken und zurückzuliefern.
Die HttpResponse-Klasse befindet sich unterhalb des django.http Modules.
Verwendung
Strings übergeben
In der Regel übergibt man den Inhalt einer Seite als String an den Konstruktor von HttpResponse:
>>> response = HttpResponse("Hier ist der Text dieser Web-Seite.")
>>> response = HttpResponse("Nur Text bitte.", mimetype="text/plain")
Falls du Inhalt inkrementell hinzufügen möchtest, kannst du response wie ein Datei-Objekt verwenden:
>>> response = HttpResponse()
>>> response.write("<p>Hier ist der Text dieser Web-Seite.</p>")
>>> response.write("<p>Hier ist ein weiter Absatz.</p>")
Du kannst Kopfdaten (Header) per Dictionary Syntax hinzufügen oder löschen:
>>> response = HttpResponse() >>> response['X-DJANGO'] = "Ist das Beste." >>> del response['X-PHP'] >>> response['X-DJANGO'] "Ist das Beste."
Beachte, dass del keinen KeyError wirft, falls dieser Header nicht existiert.
Iteratoren übergeben
Schließlich kannst du HttpResponse einen Iterator anstatt hart-kodierte Strings übergeben. Falls du diese Technik anwendest, folge diesen Vorgaben:
- Der Iterator muss Strings zurückliefern.
- Falls HttpResponse mit einem Iterator als Inhalt initialisiert wurde, kannst du die HttpResponse Instanz wie ein Datei-Objekt verwenden. Falls das der Fall sein sollte, wird eine Exception geworfen.
Methoden
- __init__(content='', mimetype=None, status=200, content_type=DEFAULT_CONTENT_TYPE)
Initialisiert ein HttpResponse-Objekt mit dem übergebenen Seiteninhalt (ein String) und dem MIME-Type. Der DEFAULT_CONTENT_TYPE ist 'text/html'.
content kann ein Iterator oder ein String sein. Falls es ein Iterator ist, muss er Strings zurückliefern. Diese Strings werden dann aneinandergefügt, um den Inhalt des Response zu formen.
status ist der HTTP-Status-Code für den Response.
(Neu in Djangos Entwicklerversion) content_type ist ein Alias für mimetype. Vorher wurde der Parameter mimetype genannt, kann aber, da der Wert eigentlich im HTTP Content-Type Header enthalten ist, auch das Encoding des Zeichensatzes enthalten, Deshalb ist die Mimetype-Spezifikation nicht ausreichend. Falls mimetype angegeben ist (nicht None), dann wird dieser Wert verwendet. Andernfalls wird content_type verwendet. Falls keiner der beiden gegeben ist, wird die DEFAULT_CONTENT_TYPE-Einstellung verwendet.
- __setitem__(header, value)
- Setzt den gegebenen Header-Namen auf den gegebenen Wert. Beide Argumente header und value müssen Strings sein.
- __delitem__(header)
- Löscht den Header anhand des übergebenen Namens. Schlägt schweigend fehl, falls der Header nicht existiert. Abhängig von der Groß-/Kleinschreibung.
- __getitem__(header)
- Gibt den Wert des übergebenen Header-Namens zurück. Abhängig von der Groß-/Kleinschreibung.
- has_header(header)
- Gibt True oder False, falls der Header existiert. Dabei wird nicht auf Groß-/Kleinschreibung des übergebenen Wertes geachtet.
- set_cookie(key, value='', max_age=None, expires=None, path='/', domain=None, secure=None)
Setzt einen Cookie. Die Parameter sind die selben wie im cookie Morsel-Objekt der Python Standard Bibliothek.
- max_age muss in Sekunden (Zahl) oder als None (default), falls der Cookie nur so lange gültig wie die Browsersession des Clients sein soll, angegeben werden.
- expires muss ein String im dem Format "Wdy, DD-Mon-YY HH:MM:SS GMT" sein.
- Verwende domain, falls du einen Cross-Domain-Cookie setzen möchtest. Zum Beispiel domain=".lawrence.com" würde einen Cookie setzen, der von den Domains www.lawrence.com, blogs.lawrence.com und calendars.lawrence.com lesbar ist. Anderfalls wäre der Cookie nur von der Domain lesbar, auf der dieser auch gesetzt wurde.
- delete_cookie(key, path='/', domain=None)
Löscht den Cookie mit dem Namen des übergebenen Schlüssels. Schlägt schweigend fehl, falls der Schlüssel nicht existiert.
Da Cookies eine bestimmte Arbeitsweise haben, müssen die Werte von path und domain mit denen von set_cookie() übereinstimmen — anderfalls kann der Cookie nicht gelöscht werden.
- content
- Gibt den Inhalt als Python-String zurück. Enkodiert ihn, falls nötig, aus einem Unicode-Objekt. Zu beachten ist, dass es sich hierbei um eine Eigenschaft, und keine Methode, handelt. Deshalb muss man r.content anstatt r.content() verwenden.
- write(content), flush() and tell()
- Diese Methoden verwandeln eine HttpResponse-Instanz zu einem datei-ähnlichen Objekt.
HttpResponse-Unterklassen
Django enthält eine Menge an HttpResponse-Unterklassen, die verschiedene Typen von HTTP Responses behandeln. Wie HttpResponse befinden sich diese Unterklassen in django.http.
- HttpResponseRedirect
- Der Konstruktor nimmt ein einziges Argument entgegen — den Pfad auf den umgeleitet werden soll. Das kann eine voll qualifizierte URL (e.g. 'http://www.yahoo.com/search/') oder eine absolute URL ohne Domain-Namen (e.g. '/search/') sein. Beachte, dass der HTTP-Status-Code 302 zurückgegeben wird.
- HttpResponsePermanentRedirect
- Wie HttpResponseRedirect, nur dass eine permanente Umleitung (HTTP-Status-Code 301) anstatt einer “gefundenen” Umleitung (Status Code 302) zurückgegeben wird.
- HttpResponseNotModified
- Der Konstruktor nimmt keinerlei Argumente entgegen. Verwende diesen, um zu kennzeichen, dass eine Seite seit dem letzten Besuch des Benutzers nicht verändert wurde (Status Code 304).
- HttpResponseBadRequest
- Neu in Djangos Entwicklerversion. Verhält sich wie HttpResponse, verwendet aber den Status Code 400.
- HttpResponseNotFound
- Verhält sich wie HttpResponse, verwendet aber den Status Code 404.
- HttpResponseForbidden
- Verhält sich wie HttpResponse, verwendet aber den Status Code 403.
- HttpResponseNotAllowed
- Wie HttpResponse, verwendet aber den Status Code 403. Nimmt ein einzelnes benötigtes Argument entgegen: eine Liste von erlaubten Methoden (z.B. ['GET', 'POST']).
- HttpResponseGone
- Verhält sich wie HttpResponse, verwendet aber den Status Code 410.
- HttpResponseServerError
- Verhält sich wie HttpResponse, verwendet aber den Status Code 500.
Fehler zurückgeben
Mit Django ist es einfach HTTP-Fehler-Codes zurückzugeben. Wir haben bereits HttpResponseNotFound, HttpResponseForbidden, HttpResponseServerError, usw., Unterklassen angesprochen; du musst nur eine Instanz einer dieser Unterklassen anstatt einer normalen HttpResponse-Instanz zurückgeben, um einen Fehler zu bezeichnen. Zum Beispiel:
def meine_view(request):
# ...
if foo:
return HttpResponseNotFound('<h1>Seite nicht gefunden</h1>')
else:
return HttpResponse('<h1>Seite gefunden</h1>')
Da 404-Fehler, die mit Abstand häufigsten HTTP-Fehler sind, gibt es dafür einen einfacheren Weg, um diese Fehler zu behandeln.
Die Http404 Exception
Falls du einen Fehler wie HttpResponseNotFound zurückgibst, bist du selbst dafür verantwortlich den HTML-Code der resultierenden Fehlerseite zu definieren:
return HttpResponseNotFound('<h1>Seite nicht gefunden</h1>')
Zur Vereinfachung und da es eine gute Idee ist, eine konsistente 404-Fehlerseite über die komplette Site zu haben, stellt Django eine Http404 Exception zur Verfügung. Falls du eine Http404 Exception an irgendeiner Stelle deiner View-Funktion wirfst, wird Django diesen auffangen und die Standard-Fehlerseite deiner Anwendung zusammen mit dem HTTP-Fehler-Code 404 zurückgeben.
Beispielanwendung:
from django.http import Http404
def detail(request, poll_id):
try:
p = Poll.objects.get(pk=poll_id)
except Poll.DoesNotExist:
raise Http404
return render_to_response('polls/detail.html', {'poll': p})
Um die Http404 Exception vollständig anzuwenden, solltest du ein Template erstellen, das bei jedem 404-Fehler angezeigt wird. Dieses Template muss 404.html genannt werden und auf oberster Ebene deines Template-Verzeichnisses liegen.
Fehler-Views anpassen
Die 404 (Seite nicht gefunden) View
Wenn du eine Http404 Exception wirfst, lädt Django eine spezielle View, die dem behandeln von 404-Fehlern gewidmet ist. Standardmässig ist das die View django.views.defaults.page_not_found, die das Template 404.html lädt und das Template rendert.
Das bedeutet, dass du ein 404.html Template in dem Root deines Template-Verzeichnisses anlegen musst. Dieses Template wird dann für alle 404 Fehler verwendet.
Diese page_not_found View sollte für 99 % aller Web-Anwendungen ausreichend sein. Aber falls du die 404 View überschreiben möchtest, kannst du einen handler404 in deiner URLconf folgendermassen angeben:
handler404 = 'mysite.views.my_custom_404_view'
Hinter den Kulissen bestimmt Django die 404 View indem es nach handler404 schaut. Standardmässig enthält URLconfs die folgende Zeile:
from django.conf.urls.defaults import *
Diese Zeile kümmerst sich um die handler404 Einstellung im aktuellen Modul. Wie du in django/conf/urls/defaults.py sehen kannst, wird handler404 standardmässig auf 'django.views.defaults.page_not_found' gesetzt.
Drei Dinge, die man zu 404 Views bemerken muss:
- Die 404 View wird auch aufgerufen, falls Django keinen einzigen Treffer nach der Prüfung der regulären Ausdrücke der URLconf findet.
- Falls du keine eigene 404 View definierst — und einfachhalber den Standard verwendest, was empfohlen ist — gibt es immer noch eine Pflichtaufgabe: Du musst ein 404.html-Template im Root deines Template Verzeichnisses anlegen. Die Standard 404 View wird dieses Template für alle 404 Fehler verwenden. Der Standard 404 View übergibt dem Template lediglich eine Variable: request_path, die URL, die in den 404 resultierte.
- Die 404 View bekommt einen RequestContext übergeben und kann auf die Variablen zugreifen, die durch die TEMPLATE_CONTEXT_PROCESSORS (z. B. MEDIA_URL) bereitgestellt werden.
- Falls DEBUG auf True (in deinen Einstellungen) gesetzt ist, wird deine 404 View nie verwendet und stattdessen ein Traceback angezeigt.
Die 500 (Serverfehler) View
Ebenso hat Django ein spezielles Verhalten, falls Laufzeitfehler im View-Code auftreten. Falls eine View in eine Exception endet, ruft Django standardmässig die View django.views.defaults.server_error auf, die das Template 500.html lädt und rendert.
Das bedeutet, dass du ein 500.html Template im Root deines Template-Verzeichnisses anlegen musst. Dieses Template wird dann für alle Serverfehler verwendet. Die Standard 500 View übergibt keine Variable an das Template und wird mit einem leeren Context gerendert, um weitere Fehler zu verhindern.
Dieser server_error sollte für 99 % alles Web-Anwendungen ausreichend sein, kann aber bei Bedarf überschrieben werden. Du kannst dafür handler500 in deiner URLconf folgendermassen definieren:
handler500 = 'mysite.views.my_custom_error_view'
Hinter den Kulissen bestimmt Django diesen Fehler indem es nach handler500 schaut. Standardmässig enthält URLconfs die folgende Zeile:
from django.conf.urls.defaults import *
Diese Zeile kümmerst sich um die handler500 Einstellung im aktuellen Modul. Wie du in django/conf/urls/defaults.py sehen kannst, wird handler500 standardmässig auf 'django.views.defaults.server_error' gesetzt.