[PYTHON] Django Server Error (500) Strategie [2019 Adcare]

Dies ist meine erste Teilnahme am Adventskalender. Ich freue mich darauf, mit Dir zu arbeiten.

Überblick

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) **.

Server Error (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.

Serverfehler (500) ist aufgetreten

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.

Server Error (500)

Dieser Bildschirm wird von handler500 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.

Weisen Sie handler500 eine andere Funktion zu

  1. Definieren Sie Ihre eigene server_error-Funktion
  2. Weisen Sie es handler500 zu

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.

django3.jpg

Danach können Sie in my_customized_server_error schreiben, was Sie möchten.

Beispiel für my_customized_server_error

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.

django4.jpg

Der Django-Adventskalender von morgen lautet @boxboxbax. Viel Glück!

Recommended Posts

Django Server Error (500) Strategie [2019 Adcare]
Django2.2 SQLite3-Versionsfehler
Django settings.py SECRET_KEY Fehler
Fehler: 500 (Interner Serverfehler) Jupyter-Labor
[Django] Erstellen Sie Ihre eigene 403, 404, 500-Fehlerseite