Dies ist meine erste Teilnahme am Adventskalender. Ich freue mich darauf, mit Dir zu arbeiten.
Mein Hobby ist Pythonista. Ich habe dieses Jahr mit Django angefangen und eine Website erstellt. Dieses Mal werde ich eine grobe Strategie für Django-Anfänger schreiben, die mit mir identisch sind, über die Dinge, die mich zuerst stören und einen traurigen Schrei auslösen werden. Es ist ** Serverfehler (500) **.
Versuchen Sie zu diesem Zeitpunkt, den Fehlerinhalt auf dem Bildschirm anzuzeigen, das Protokoll auszugeben oder Slack auch nur vorübergehend über den Fehlerinhalt zu informieren.
Ich bin ein Anfänger, also habe ich der views.py-Methode gerade einen Fehler hinzugefügt.
views.py
def index(request):
aaaa #← Plötzlich aaaa
return HttpResponse('<p>Hello world.</p>')
Wenn "DEBUG" in settings.py "True" ist, wird eine beschreibende Fehlermeldung wie die folgende angezeigt:
Sobald Sie jedoch "DEBUG" in "False" ändern, wird auf dem Gesicht des Elternteils der Serverfehler (500) angezeigt.
Der Handler, wenn ein Serverfehler auftritt, ist [django.conf.urls. \ _ \ _ Init \ _ \ _. Py](https://github.com/django/django/blob/master/django/conf/urls/ Es war in init.py # L9).
django/conf/urls/__init__.py
handler500 = defaults.server_error
Dieser Handler500 wird ausgeführt, wenn auf dem Server ein Fehler auftritt. Das heißt, die Funktion defaults.server_error wird ausgeführt. Wenn Sie in django.views.defaults.server_error nachsehen, wird dieser Bildschirm angezeigt Es wird beschrieben.
django/views/defaults.py
@requires_csrf_token
def server_error(request, template_name=ERROR_500_TEMPLATE_NAME):
"""
500 error handler.
Templates: :template:`500.html`
Context: None
"""
#Unterlassung
return HttpResponseServerError(
ERROR_PAGE_TEMPLATE % {'title': 'Server Error (500)', 'details': ''},
content_type='text/html',
)
Dann sollte die Funktion, die handler500 zugewiesen werden soll, eine andere Funktion als defaults.server_error sein.
Versuchen Sie, Ihren eigenen Serverfehler in views.py zu definieren. Weil das Original in django.views.defaults definiert ist.
views.py
@requires_csrf_token
def my_customized_server_error(request, template_name='500.html'):
return HttpResponseServerError('<h1>Server Error (500)Korrekt</h1>')
Die Zuweisung zu handler500 erfolgt in urls.py. Die ursprüngliche Definition von handler500 befindet sich in django.conf.urls.
urls.py
handler500 = views.my_customized_server_error
Ich konnte den Serverfehlerbildschirm ändern.
Danach können Sie in my_customized_server_error schreiben, was Sie möchten.
Code, der normalerweise "druckt".
views.py
@requires_csrf_token
def my_customized_server_error(request, template_name='500.html'):
import traceback
print(traceback.format_exc())
return HttpResponseServerError('<h1>Server Error (500)Korrekt</h1>')
Dieser Code zeigt den gleichen Fehlerbildschirm an wie bei DEBUG = True
. Das ist leicht zu sehen, nicht wahr? (Kleines Gefühl)
views.py
@requires_csrf_token
def my_customized_server_error(request, template_name='500.html'):
import sys
from django.views import debug
error_html = debug.technical_500_response(request, *sys.exc_info()).content
return HttpResponseServerError(error_html)
Code, der den Standardbildschirm für Serverfehler (500) vom Gesicht der Eltern aus anzeigt. Sie können den zuvor gefundenen django.views.defaults.server_error verwenden.
views.py
@requires_csrf_token
def my_customized_server_error(request, template_name='500.html'):
from django.views.defaults import server_error
return server_error(request, template_name)
Code, der Benachrichtigungen an jedermanns Lieblings-Slack überspringt.
views.py
@requires_csrf_token
def my_customized_server_error(request, template_name='500.html'):
import requests
import json
import traceback
requests.post(
'Ihre Slack Webhook URL',
data=json.dumps({
'text': '\n'.join([
f'Request uri: {request.build_absolute_uri()}',
traceback.format_exc(),
]),
'username': 'Django-Fehlerbenachrichtigung',
'icon_emoji': ':jack_o_lantern:',
})
)
return HttpResponseServerError('<h1>Server Error (500)Korrekt</h1>')
Ich flog. Da die Verzeichnisstruktur meines Ortes angezeigt wird, werde ich ein Mosaik einfügen.
Der Django-Adventskalender von morgen lautet @boxboxbax. Viel Glück!