Django erstellt eine benutzerdefinierte 500/404-Fehlerseite

Lesezeit: 10 Minuten

Django erstellt eine benutzerdefinierte 500404 Fehlerseite
reZach

Nach dem Tutorial gefunden Hier genau, ich kann keine benutzerdefinierte 500- oder 404-Fehlerseite erstellen. Wenn ich eine fehlerhafte URL eingebe, gibt mir die Seite die Standardfehlerseite. Gibt es irgendetwas, das ich überprüfen sollte, das verhindern würde, dass eine benutzerdefinierte Seite angezeigt wird?

Dateiverzeichnisse:

mysite/
    mysite/
        __init__.py
        __init__.pyc
        settings.py
        settings.pyc
        urls.py
        urls.pyc
        wsgi.py
        wsgi.pyc
    polls/
        templates/
            admin/
                base_site.html
            404.html
            500.html
            polls/
                detail.html
                index.html
        __init__.py
        __init__.pyc
        admin.py
        admin.pyc
        models.py
        models.pyc
        tests.py
        urls.py
        urls.pyc
        view.py
        views.pyc
    templates/
    manage.py

Innerhalb von mysite/settings.py habe ich diese aktiviert:

DEBUG = False
TEMPLATE_DEBUG = DEBUG

#....

TEMPLATE_DIRS = (
    'C:/Users/Me/Django/mysite/templates', 
)

innerhalb von mysite/polls/urls.py:

from django.conf.urls import patterns, url

from polls import views

urlpatterns = patterns('',
    url(r'^$', views.index, name="index"),
    url(r'^(?P<poll_id>d+)/$', views.detail, name="detail"),
    url(r'^(?P<poll_id>d+)/results/$', views.results, name="results"),
    url(r'^(?P<poll_id>d+)/vote/$', views.vote, name="vote"),
)

Ich kann jeden anderen erforderlichen Code posten, aber was sollte ich ändern, um eine benutzerdefinierte 500-Fehlerseite zu erhalten, wenn ich eine ungültige URL verwende?

Bearbeiten

LÖSUNG:
Ich hatte eine zusätzliche

TEMPLATE_DIRS

innerhalb meiner settings.py und das verursachte das Problem

  • Debug ist in meinem Code auf False gesetzt

    – reZach

    15. Juli 13 um 20:09 Uhr

  • Dies könnte Ihnen helfen: stackoverflow.com/a/12180499/1628832

    – karthikr

    15. Juli 13 um 20:10 Uhr

  • Ich habe diese Antwort gefunden, als ich nach einer Möglichkeit gesucht habe, nur eine benutzerdefinierte Vorlage zu erstellen, und ich wollte ein bisschen Django-Dokumentation teilen, was mir sehr geholfen hat. docs.djangoproject.com/en/1.7/ref/views/…

    – Blackeagle52

    31. Dezember 14 um 11:59 Uhr

  • Mine funktionierte ohne die Einstellung template_dirs.

    – Programmierjoe

    14. Februar 16 um 4:52 Uhr

  • Punkte für Ironie, wenn der Link in der ersten Zeile auf die 404-Seite von Django führt. Führt zu einer Tutorial-Seite für eine Version von Django, die meiner Meinung nach nicht existiert. Hier ist der Link zur Tutorial-Seite für Django 2.0: docs.djangoproject.com/en/2.0/intro/tutorial03

    – Andreas

    7. Dezember 17 um 22:36 Uhr


Django erstellt eine benutzerdefinierte 500404 Fehlerseite
Aaron Lelevier

Unter deinem Main views.py Fügen Sie Ihre eigene benutzerdefinierte Implementierung der folgenden zwei Ansichten hinzu und richten Sie einfach die Vorlagen ein 404.html und 500.html mit dem, was Sie anzeigen möchten.

Bei dieser Lösung muss kein benutzerdefinierter Code hinzugefügt werden urls.py

Hier ist der Code:

from django.shortcuts import render_to_response
from django.template import RequestContext


def handler404(request, *args, **argv):
    response = render_to_response('404.html', {},
                                  context_instance=RequestContext(request))
    response.status_code = 404
    return response


def handler500(request, *args, **argv):
    response = render_to_response('500.html', {},
                                  context_instance=RequestContext(request))
    response.status_code = 500
    return response

Aktualisieren

handler404 und handler500 sind exportierte Django-String-Konfigurationsvariablen, die in gefunden werden django/conf/urls/__init__.py. Deshalb funktioniert die obige Konfiguration.

Damit die obige Konfiguration funktioniert, sollten Sie die folgenden Variablen in Ihrer definieren urls.py Datei und verweisen Sie die exportierten Django-Variablen wie folgt auf den String-Python-Pfad, in dem diese Django-Funktionsansichten definiert sind:

# project/urls.py

handler404 = 'my_app.views.handler404'
handler500 = 'my_app.views.handler500'

Update für Django 2.0

Signaturen für Handler-Ansichten wurden in Django 2.0 geändert:
https://docs.djangoproject.com/en/2.0/ref/views/#error-views

Wenn Sie Ansichten wie oben verwenden, schlägt handler404 mit der Meldung fehl:

“handler404() hat ein unerwartetes Schlüsselwortargument ‘Ausnahme’ erhalten”

Ändern Sie in diesem Fall Ihre Ansichten wie folgt:

def handler404(request, exception, template_name="404.html"):
    response = render_to_response(template_name)
    response.status_code = 404
    return response

  • Eine andere Sache, über die ich mich gewundert habe – was ist, wenn Sie das Admin-Backend verwenden und dafür separate Vorlagen verwenden möchten? Meines Wissens hat der Administrator keine views.py zum Überschreiben und Einfügen dieses Codes.

    – Schwerkraftgrab

    25. September 14 um 16:14 Uhr

  • @GravityGrave die 500 template wird nicht gerendert request.user weil es einen 500-Serverfehler meldet, sodass der Server nichts bereitstellen kann.

    – Aaron Lelevier

    25. September 14 um 17:02 Uhr

  • Hat bei mir mit Django 1.9 nicht funktioniert ;( Vielleicht mache ich etwas falsch. Ist handler404 Django reservierter Name? Woher würde Django wissen, dass es genau diese Ansicht aufrufen sollte?

    – Todesengel908

    14. Februar 16 um 13:25 Uhr


  • Ich habe die Antwort basierend auf Ihrem Kommentar aktualisiert. Sorry, dass das Update so spät kommt. Ich hoffe, dass dies hilft.

    – Aaron Lelevier

    26. Dezember 17 um 22:25 Uhr

  • render_to_response wurde ersetzt durch render in Django 3.0, das automatisch verwendet RequestContextwodurch der Beispielcode dieser Antwort vereinfacht wird

    – Kraymichael

    11. Oktober 20 um 5:57 Uhr

1643387770 156 Django erstellt eine benutzerdefinierte 500404 Fehlerseite
Flimmer

Offizielle Antwort:

Hier ist der Link zur offiziellen Dokumentation zum Einrichten benutzerdefinierter Fehleransichten:

https://docs.djangoproject.com/en/stable/topics/http/views/#customizing-error-views

Es sagt, dass Sie Zeilen wie diese in Ihre URLconf einfügen sollen (wenn Sie sie an einer anderen Stelle setzen, hat dies keine Auswirkung):

handler404 = 'mysite.views.my_custom_page_not_found_view'
handler500 = 'mysite.views.my_custom_error_view'
handler403 = 'mysite.views.my_custom_permission_denied_view'
handler400 = 'mysite.views.my_custom_bad_request_view'

Sie können die CSRF-Fehleranzeige auch anpassen, indem Sie die Einstellung ändern CSRF_FAILURE_VIEW.

Standardfehlerbehandler:

Es lohnt sich, die Dokumentation der Standard-Error-Handler zu lesen, page_not_found, server_error, permission_denied und bad_request. Standardmäßig verwenden sie diese Vorlagen, wenn sie sie finden können: 404.html, 500.html, 403.htmlund 400.html.

Wenn Sie also nur schöne Fehlerseiten erstellen möchten, erstellen Sie diese Dateien einfach in a TEMPLATE_DIRS Verzeichnis müssen Sie URLConf überhaupt nicht bearbeiten. Lesen Sie die Dokumentation, um zu sehen, welche Kontextvariablen verfügbar sind.

In Django 1.10 und höher verwendet die standardmäßige CSRF-Fehleransicht die Vorlage 403_csrf.html.

Erwischt:

Vergiss das nicht DEBUG muss auf False gesetzt werden, damit diese funktionieren, andernfalls werden die normalen Debug-Handler verwendet.

  • Ich habe hinzugefügt, aber es funktioniert nicht. Der Handler404 und andere, die auf die richtigen Stellen in meinen Ansichten verweisen, wurden hinzugefügt, aber es funktioniert nicht, es wird immer noch der Standardwert 404 angezeigt. Und ja, ich bin im Debug-False-Modus und verwende 1.9

    – KhoPhi

    3. August 16 um 19:02 Uhr

  • Wenn Sie Django 1.9 verwenden und einfach 500.html usw.-Vorlagen hinzufügen, werden diese anstelle von Standardseiten angezeigt. Schöne einfache Lösung.

    – Krümmung

    12. September 16 um 15:29 Uhr

  • Erwischt half mir. Es funktionierte, indem ich diese Änderungen in meiner settings.py vornahm, DEBUG=False und ALLOWED_HOSTS = setzte [‘0.0.0.0’] um HTTP-Anfragen von jedem Client zu akzeptieren.

    – schaffuu

    22. Mai ’17 um 16:31 Uhr

  • Nur für den Fall, dass sich noch jemand fragt, wo um alles in der Welt URLconf ist, Hier ist es

    – Arthur Tarasov

    15. Juni 19 um 5:49 Uhr

  • @ArthurTarasov Ja, es wäre besser gewesen, die Datei urls.py zusammen mit ihr zu referenzieren, haha.

    – Zack Plauché

    31. August 2020 um 13:38 Uhr

1643387770 791 Django erstellt eine benutzerdefinierte 500404 Fehlerseite
Rüstung

Fügen Sie diese Zeilen in urls.py hinzu

urls.py

from django.conf.urls import (
handler400, handler403, handler404, handler500
)

handler400 = 'my_app.views.bad_request'
handler403 = 'my_app.views.permission_denied'
handler404 = 'my_app.views.page_not_found'
handler500 = 'my_app.views.server_error'

# ...

und implementieren Sie unsere benutzerdefinierten Ansichten in views.py.

Ansichten.py

from django.shortcuts import (
render_to_response
)
from django.template import RequestContext

# HTTP Error 400
def bad_request(request):
    response = render_to_response(
        '400.html',
        context_instance=RequestContext(request)
        )

        response.status_code = 400

        return response

# ...

  • Warum würdest du importieren handler400 nur um es damit zu überschreiben handler400 = 'myapp.views.bad_request'?

    – Flimmer

    3. Juni 16 um 9:21 Uhr

  • docs.djangoproject.com/en/1.10/topics/http/views/…

    – art_robot

    30. Oktober 16 um 12:41 Uhr

  • Sie müssen die Handler hier nicht importieren, um sie zu überschreiben.

    – Funkotron

    30. November 16 um 15:46 Uhr

  • Sie sollten nicht verwenden render_to_response. Aus den Dokumenten: “Es wird nicht empfohlen und wird wahrscheinlich in Zukunft veraltet sein.”

    – Timmy O’Mahony

    19. Oktober 17 um 8:53 Uhr


  • Für Django 1.10, wie render_to_response wird veraltet sein, siehe folgende (use render stattdessen): stackoverflow.com/questions/44228397/…

    – Mrdaliri

    26. April 18 um 14:26 Uhr

1643387770 205 Django erstellt eine benutzerdefinierte 500404 Fehlerseite
elano7

Django 3.0+ 4.0+

hier ist Verknüpfung wie man Fehleransichten anpasst

hier ist Verknüpfung wie man eine Ansicht rendert

in dem urls.py (die wichtigste, im Projektordner), setzen:

handler404 = 'my_app_name.views.custom_page_not_found_view'
handler500 = 'my_app_name.views.custom_error_view'
handler403 = 'my_app_name.views.custom_permission_denied_view'
handler400 = 'my_app_name.views.custom_bad_request_view'

und in der genannten App (my_app_name) eintragen views.py:

def custom_page_not_found_view(request, exception):
    return render(request, "errors/404.html", {})

def custom_error_view(request, exception=None):
    return render(request, "errors/500.html", {})

def custom_permission_denied_view(request, exception=None):
    return render(request, "errors/403.html", {})

def custom_bad_request_view(request, exception=None):
    return render(request, "errors/400.html", {})

HINWEIS: errors/404.html ist der Pfad, wenn Sie Ihre Dateien im Vorlagenordner der Projekte (nicht der Apps) ablegentemplates/errors/404.html Bitte platzieren Sie die Dateien an der gewünschten Stelle und geben Sie den richtigen Pfad ein.

HINWEIS 2: Wenn Sie nach dem Neuladen der Seite immer noch die alte Vorlage sehen, ändern Sie sie settings.py DEBUG=Truespeichern Sie es und dann noch einmal zu False und erneut speichern (dadurch wird der Server neu gestartet und die neuen Dateien gesammelt).

Von der Seite, auf die Sie verwiesen haben:

Wenn Sie Http404 aus einer Ansicht heraus aufrufen, lädt Django eine spezielle Ansicht, die der Behandlung von 404-Fehlern gewidmet ist. Es findet es, indem es nach der Variable handler404 in Ihrer Root-URLconf sucht (und nur in Ihrer Root-URLconf; das Festlegen von handler404 an anderer Stelle hat keine Auswirkung), bei der es sich um eine Zeichenfolge in gepunkteter Python-Syntax handelt – dasselbe Format, das die normalen URLconf-Callbacks verwenden. Eine 404-Ansicht selbst hat nichts Besonderes: Es ist nur eine normale Ansicht.

Ich glaube also, Sie müssen Ihrer urls.py so etwas hinzufügen:

handler404 = 'views.my_404_view'

und ähnliches für handler500.

  • Wie sieht das aus Mike? Heute ist mein erster Tag mit Django und ich hänge immer noch an den Seilen

    – reZach

    15. Juli 13 um 20:17 Uhr

  • @JimRilye Sie müssen Ihren Ansichten eine geeignete 500-Funktion hinzufügen und sie dann mit dieser Variablen referenzieren. Also über deinem urlpatterns = ... Zeile, fügen Sie eine Zeile hinzu, die besagt handler500 = 'views.handle500'und fügen Sie dann a hinzu def handle500(request): zu Ihrer views.py, die Ihre 500.html anzeigt.

    – Mike Pelley

    16. Juli 13 um 14:26 Uhr

1643387771 652 Django erstellt eine benutzerdefinierte 500404 Fehlerseite
Krishna G. Nair

Wenn Sie nur benutzerdefinierte Seiten anzeigen müssen, die einige ausgefallene Fehlermeldungen für Ihre Website enthalten, wenn DEBUG = Falsefügen Sie dann zwei Vorlagen mit den Namen 404.html und 500.html in Ihrem Vorlagenverzeichnis hinzu und es wird diese benutzerdefinierten Seiten automatisch abrufen, wenn ein 404- oder 500-Fehler ausgelöst wird.

  • Wie sieht das aus Mike? Heute ist mein erster Tag mit Django und ich hänge immer noch an den Seilen

    – reZach

    15. Juli 13 um 20:17 Uhr

  • @JimRilye Sie müssen Ihren Ansichten eine geeignete 500-Funktion hinzufügen und sie dann mit dieser Variablen referenzieren. Also über deinem urlpatterns = ... Zeile, fügen Sie eine Zeile hinzu, die besagt handler500 = 'views.handle500'und fügen Sie dann a hinzu def handle500(request): zu Ihrer views.py, die Ihre 500.html anzeigt.

    – Mike Pelley

    16. Juli 13 um 14:26 Uhr

1643387771 544 Django erstellt eine benutzerdefinierte 500404 Fehlerseite
Rehmat

Bei Django 3.xdie akzeptierte Antwort funktioniert nicht, weil render_to_response wurde vollständig entfernt und seit der Version, für die die akzeptierte Antwort funktionierte, wurden weitere Änderungen vorgenommen.

Einige andere Antworten sind auch da, aber ich präsentiere eine etwas sauberere Antwort:

In Ihrer Hauptsache urls.py Datei:

handler404 = 'yourapp.views.handler404'
handler500 = 'yourapp.views.handler500'

In yourapp/views.py Datei:

def handler404(request, exception):
    context = {}
    response = render(request, "pages/errors/404.html", context=context)
    response.status_code = 404
    return response


def handler500(request):
    context = {}
    response = render(request, "pages/errors/500.html", context=context)
    response.status_code = 500
    return response

Stellen Sie sicher, dass Sie importiert haben render() in yourapp/views.py Datei:

from django.shortcuts import render

Randnotiz: render_to_response() war in Django veraltet 2.x und es wurde in der Version vollständig entfernt 3.x.

.

676820cookie-checkDjango erstellt eine benutzerdefinierte 500/404-Fehlerseite

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy