Nach dem tutorial hier genau, kann ich nicht eine benutzerdefinierte 500 oder 404 Fehlerseite erstellen. Wenn ich eine falsche URL eingebe, gibt mir die Seite die Standardfehlerseite. Gibt es etwas, auf das ich prüfen 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 Folgendes 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 veröffentlichen, aber was sollte ich ändern, um eine benutzerdefinierte 500-Fehlerseite zu erhalten, wenn ich eine schlechte URL verwende?
Bearbeiten
LÖSUNG: Ich hatte eine zusätzliche
TEMPLATE_DIRS
innerhalb meiner settings.py und das verursachte das Problem
Antworten:
Fügen Sie unter Ihrem Hauptbild
views.py
Ihre eigene benutzerdefinierte Implementierung der folgenden beiden Ansichten hinzu und richten Sie einfach die Vorlagen 404.html und 500.html mit den gewünschten Informationen ein .Mit dieser Lösung muss kein benutzerdefinierter Code hinzugefügt werden
urls.py
Hier ist der Code:
Aktualisieren
handler404
undhandler500
werden exportiert Django String Konfigurationsvariablen gefunden indjango/conf/urls/__init__.py
. Deshalb funktioniert die obige Konfiguration.Damit die obige Konfiguration funktioniert, sollten Sie die folgenden Variablen in Ihrer
urls.py
Datei definieren und die exportierten Django-Variablen auf den Python-Zeichenfolgenpfad verweisen, in dem diese Django-Funktionsansichten definiert sind:Update für Django 2.0
Die Signaturen für Handleransichten wurden in Django 2.0 geändert: https://docs.djangoproject.com/de/2.0/ref/views/#error-views
Wenn Sie Ansichten wie oben verwenden, schlägt handler404 mit der folgenden Meldung fehl:
Ändern Sie in diesem Fall Ihre Ansichten wie folgt:
quelle
500 template
wird nicht gerendert ,request.user
da ein 500-Server-Fehler gemeldet wird, sodass der Server nichts bereitstellen kann.Offizielle Antwort:
Hier ist der Link zur offiziellen Dokumentation zum Einrichten benutzerdefinierter Fehleransichten:
https://docs.djangoproject.com/de/stable/topics/http/views/#customizing-error-views
Es heißt, Zeilen wie diese in Ihre URLconf einzufügen (das Festlegen an einer anderen Stelle hat keine Auswirkung):
Sie können die CSRF-Fehleransicht auch anpassen, indem Sie die Einstellung ändern
CSRF_FAILURE_VIEW
.Standardfehlerbehandlungsroutinen:
Es lohnt sich, die Dokumentation der Standardfehlerbehandlungsroutinen zu lesen,
page_not_found
,server_error
,permission_denied
undbad_request
. Standardmäßig sie diese Vorlagen verwenden , wenn sie sie finden können, jeweils:404.html
,500.html
,403.html
, und400.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
dies auf False gesetzt sein muss, damit diese funktionieren. Andernfalls werden die normalen Debug-Handler verwendet.quelle
Fügen Sie diese Zeilen in urls.py hinzu
urls.py
und implementieren Sie unsere benutzerdefinierten Ansichten in views.py.
views.py
quelle
handler400
nur importieren , um es zu überschreibenhandler400 = 'myapp.views.bad_request'
?render_to_response
. Aus den Dokumenten: "Es wird nicht empfohlen und wird wahrscheinlich in Zukunft veraltet sein."render_to_response
es veraltet sein wird, siehe folgendes (render
stattdessen verwenden): stackoverflow.com/questions/44228397/…Von der Seite, auf die Sie verwiesen haben:
Ich glaube, Sie müssen Ihrer urls.py so etwas hinzufügen:
und ähnlich für handler500.
quelle
urlpatterns = ...
Zeile eine Zeile mit der Aufschrifthandler500 = 'views.handle500'
und dann einedef handle500(request):
zu Ihrer views.py hinzu, die Ihre 500.html anzeigt.Wenn Sie nur benutzerdefinierte Seiten
DEBUG = False
anzeigen möchten, die einige ausgefallene Fehlermeldungen für Ihre Site enthalten , fügen Sie zwei Vorlagen mit den Namen 404.html und 500.html in Ihr Vorlagenverzeichnis ein, und diese benutzerdefinierten Seiten werden bei 404 oder 500 automatisch abgerufen wird angehoben.quelle
'DIRS': [os.path.join(BASE_DIR, '<project_name>/templates')]
in Ihrer TEMPLATES-Liste insettings.py
.In Django 2. * können Sie diese Konstruktion in views.py verwenden
In settings.py
In urls.py
Normalerweise erstelle ich default_app und behandle Site-weite Fehler, Kontextprozessoren darin.
quelle
exception
?locals()
? Die Datei wird nur angezeigtpass
.settings.py:
und fügen Sie einfach Ihre
404.html
und500.html
Seiten im Vorlagenordner hinzu. Entfernen404.html
und500.html
aus Vorlagen in der Umfrage-App.quelle
raise Http404('msg')
: stackoverflow.com/a/37109914/895245{{ request_path }}
ist ebenfalls verfügbar.Machen Sie einen Fehler. Finden Sie auf der Fehlerseite heraus, wo Django Vorlagen lädt. Ich meine den Pfadstapel. Fügen Sie in base template_dir diese HTML-Seiten 500.html , 404.html hinzu . Wenn diese Fehler auftreten, werden die entsprechenden Vorlagendateien automatisch geladen.
Sie können auch Seiten für andere Fehlercodes wie 400 und 403 hinzufügen .
Ich hoffe das hilft !!!
quelle
In Django
3.x
funktioniert die akzeptierte Antwort nicht, darender_to_response
sie vollständig entfernt wurde und seit der Version, für die die akzeptierte Antwort funktioniert hat, weitere Änderungen vorgenommen wurden.Es gibt auch einige andere Antworten, aber ich präsentiere eine etwas sauberere Antwort:
In Ihrer Hauptdatei
urls.py
:In
yourapp/views.py
Datei:Stellen Sie sicher, dass Sie
render()
in eineyourapp/views.py
Datei importiert haben :Randnotiz:
render_to_response()
war in Django veraltet2.x
und wurde in der Überprüfung vollständig entfernt3.x
.quelle
Als eine einzelne Zeile (für 404 generische Seite):
quelle
Dies funktioniert auf Django 2.0
Stellen Sie sicher, dass Sie Ihre benutzerdefinierten
404.html
Elemente in den Ordner mit den App-Vorlagen aufnehmen.quelle
Django 3.0
Hier finden Sie einen Link zum Anpassen von Fehleransichten
Hier ist ein Link zum Rendern einer Ansicht
Geben Sie im
urls.py
(Haupt-, im Projektordner) Folgendes ein:und in dieser App (
my_app_name
) setzen Sie inviews.py
:HINWEIS: Dies
error/404.html
ist der Pfad, wenn Sie Ihre Dateien im Vorlagenordner des Projekts (nicht der Apps) ablegentemplates/errors/404.html
ablegen. Platzieren Sie die Dateien daher an der gewünschten Stelle und schreiben Sie den richtigen Pfad.HINWEIS 2: Wenn Sie nach dem erneuten Laden der Seite die alte Vorlage weiterhin sehen, ändern Sie sie
settings.py
DEBUG=True
, speichern Sie sie und dann erneut zuFalse
(um den Server neu zu starten und die neuen Dateien zu sammeln).quelle
DEUB=False
Ihren statischen Dateien ausgeführt werden, werden diese möglicherweise nicht bereitgestellt, sodass Sie keine Vorschau Ihrer benutzerdefinierten Fehlervorlagenänderungen anzeigen können. Verwenden Sie./manage.py runserver --insecure
diese Option, um Django dazu zu bringen, ihnen trotzdem zu dienen.Es ist keine zusätzliche Ansicht erforderlich. https://docs.djangoproject.com/de/3.0/ref/views/
Legen Sie einfach die Fehlerdateien im Stammverzeichnis des Vorlagenverzeichnisses ab
Und es sollte Ihre Fehlerseite verwenden, wenn das Debuggen falsch ist
quelle
Versuchen Sie, Ihre Fehlervorlagen nach zu verschieben
.../Django/mysite/templates/
?Ich bin mir dessen sicher, aber ich denke, diese müssen für die Website "global" sein.
quelle