wake-up-neo.com

Django, eine benutzerdefinierte 500/404 Fehlerseite erstellen

Gemäß dem Tutorial hier kann ich keine benutzerdefinierte 500- oder 404-Fehlerseite erstellen. Wenn ich eine ungültige URL eingebe, wird auf der Seite die Standardfehlerseite angezeigt. Gibt es irgendetwas, auf das ich achten sollte, um zu verhindern, 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

in mysite/settings.py habe ich diese aktiviert:

DEBUG = False
TEMPLATE_DEBUG = DEBUG

#....

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

in 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 soll 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

80
Zac

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

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

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

Update

handler404 Und handler500 Werden exportiert Django String-Konfigurationsvariablen aus Django/conf/urls/__init__.py. Deshalb funktioniert die obige Konfiguration.

Um die obige Konfiguration zum Laufen zu bringen, sollten Sie die folgenden Variablen in Ihrer urls.py - Datei definieren und die exportierten Django Variablen auf den String Python = Pfad, in dem diese Django Funktionsansichten definiert sind, wie folgt:

# project/urls.py

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

Update für Django 2.0

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

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

"handler404 () hat ein unerwartetes Keyword-Argument" Ausnahme "erhalten"

In diesem Fall ändern Sie Ihre Ansichten wie folgt:

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

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 heißt, dass Sie in Ihrer URLconf Zeilen wie diese hinzufügen sollen (wenn Sie sie an einer anderen Stelle einstellen, 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-Fehleransicht auch anpassen, indem Sie die Einstellung CSRF_FAILURE_VIEW .

Standard-Fehlerbehandlungsroutinen:

Es lohnt sich, die Dokumentation der Standardfehlerbehandlungsroutinen 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.html, und 400.html.

Wenn Sie also nur hübsche Fehlerseiten erstellen möchten, erstellen Sie diese Dateien einfach in einem TEMPLATE_DIRS -Verzeichnis, Sie müssen URLConf überhaupt nicht bearbeiten. Lesen Sie die Dokumentation, um festzustellen, welche Kontextvariablen verfügbar sind.

In Django 1.10 und höher verwendet die Standard-CSRF-Fehleransicht die Vorlage 403_csrf.html.

Erwischt:

Vergessen Sie nicht, dass DEBUG auf False gesetzt sein muss, damit dies funktioniert. Andernfalls werden die normalen Debug-Handler verwendet.

53
Flimm

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.

views.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

# ...
33
Armance

Von der Seite, auf die Sie verwiesen haben:

Wenn Sie Http404 aus einer Ansicht aufrufen, lädt Django eine spezielle Ansicht zur Behandlung von 404-Fehlern. Sie wird gefunden, indem Sie in Ihrer Stamm-URLconf (und nur in Ihrer Stamm-URLconf) nach der Variablen handler404 suchen ; Die Einstellung von handler404 an einer anderen Stelle hat keine Auswirkung.) Dies ist eine Zeichenfolge in Python gepunkteter Syntax - dasselbe Format wie die normalen URLconf-Rückrufe. Eine 404-Ansicht selbst hat nichts Besonderes: Sie ist nur eine normale Aussicht.

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

handler404 = 'views.my_404_view'

und ähnliches für handler500.

19
Mike Pelley

Wenn Sie nur benutzerdefinierte Seiten anzeigen möchten, die einige ausgefallene Fehlermeldungen für Ihre Site enthalten, wenn DEBUG = False, und fügen Sie dann zwei Vorlagen mit den Namen 404.html und 500.html in Ihr Vorlagenverzeichnis ein. Diese benutzerdefinierten Seiten werden automatisch abgerufen, wenn 404 oder 500 ausgelöst werden.

18
Krishna G Nair

Für Django 2 folgen Sie diesen Schritten.

Bearbeiten Sie Ihre project/settings.py - Datei folgendermaßen:

DEBUG = False
ALLOWED_HOSTS = ['127.0.0.1','localhost']

Fügen Sie dies zu views.py Hinzu:

def error_404_view(request, exception):
    return render(request,'myapp/404.html')

Erstellen Sie eine benutzerdefinierte 404.html - Datei.

Gehen Sie nun zu der urls.py - Datei Ihres Projekts und fügen Sie diese Zeile nach urlpatterns hinzu:

handler404 = 'myapp.views.error_404_view'

Wenn Sie nun zu Ihrem Browser gehen und eine nicht vorhandene URL öffnen, wird eine benutzerdefinierte 404-Fehlerseite angezeigt.

14
Alex Jolig

settings.py ::::

DEBUG = False
TEMPLATE_DEBUG = DEBUG
ALLOWED_HOSTS = ['localhost']  #provide your Host name

und fügen Sie einfach Ihre Seiten 404.html und 500.html in den Vorlagenordner ein. Entfernen Sie 404.html und 500.html aus den Vorlagen in der Umfrage-App.

9
Rakesh babu

In Django 2. * können Sie diese Konstruktion in views.py verwenden

def handler404(request, exception):
    return render(request, 'errors/404.html', locals())

In settings.py

DEBUG = False

if DEBUG is False:
    ALLOWED_HOSTS = [
        '127.0.0.1:8000',
        '*',
    ]

if DEBUG is True:
    ALLOWED_HOSTS = []

In rls.py

# https://docs.djangoproject.com/en/2.0/topics/http/views/#customizing-error-views
handler404 = 'YOUR_APP_NAME.views.handler404'

Normalerweise erstelle ich default_app und behandle darin Site-weite Fehler, Kontextprozessoren.

8
DeN

Mache einen Fehler, finde auf der Fehlerseite heraus, woher Django lädt templates.Ich meine den Pfad-Stack.In base template_dir füge diese HTML-Seiten hinzu 500.html , 404.html . Wenn diese Fehler auftreten, werden die entsprechenden Vorlagendateien automatisch geladen.

Sie können auch Seiten für andere Fehlercodes hinzufügen, z. B. 4 und 4.

Ich hoffe das hilft !!!

7
allsyed

Als eine einzelne Zeile (für 404 generische Seite):

from Django.shortcuts import render_to_response
from Django.template import RequestContext

return render_to_response('error/404.html', {'exception': ex},
                                      context_instance=RequestContext(request), status=404)
5
FireZenk
# views.py
def handler404(request, exception):
    context = RequestContext(request)
    err_code = 404
    response = render_to_response('404.html', {"code":err_code}, context)
    response.status_code = 404
    return response

# <project_folder>.urls.py
handler404 = 'todo.views.handler404' 

Dies funktioniert auf Django 2.0

Stellen Sie sicher, dass Sie Ihre benutzerdefinierten 404.html im App-Vorlagenordner.

Versuchen Sie, Ihre Fehlervorlagen auf .../Django/mysite/templates/ Zu verschieben?

Ich bin mir nicht sicher, aber ich denke, diese müssen für die Website "global" sein.

3
astrognocci