Stratégie d'erreur du serveur Django (500) [Adcare 2019]

C'est ma première participation au calendrier de l'Avent. J'ai hâte de travailler avec vous.

Aperçu

Mon hobby est Pythonista. J'ai commencé avec Django cette année et j'ai créé un site Web. Cette fois, je vais écrire une stratégie approximative pour les débutants Django qui sont les mêmes que moi, sur les choses qui vont me déranger en premier et faire un triste cri. Il s'agit de ** Erreur de serveur (500) **.

Server Error (500)

À ce stade, essayez d'afficher le contenu de l'erreur à l'écran, de sortir le journal ou d'avertir Slack du contenu de l'erreur, même temporairement.

Une erreur de serveur (500) s'est produite

Je suis un débutant, donc j'ai juste ajouté un bogue à la méthode views.py.

views.py


def index(request):

    aaaa  #← aaaa soudain

    return HttpResponse('<p>Hello world.</p>')

Si DEBUG dans settings.py est True, vous verrez un message d'erreur descriptif comme celui-ci:

わかりやすいエラーメッセージ

Cependant, dès que vous changez «DEBUG» en «False», vous verrez une erreur de serveur (500) sur le visage du parent.

Server Error (500)

Cet écran est affiché par handler500

Le gestionnaire lorsqu'une erreur de serveur se produit est [django.conf.urls. \ _ \ _ Init \ _ \ _. Py](https://github.com/django/django/blob/master/django/conf/urls/ C'était dans init.py # L9).

django/conf/urls/__init__.py


handler500 = defaults.server_error

Ce handler500 sera exécuté si une erreur se produit sur le serveur. Autrement dit, la fonction defaults.server_error est exécutée. Si vous regardez à l'intérieur de django.views.defaults.server_error, le processus qui affiche cet écran est Il est décrit.

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
    """

    #Omission

        return HttpResponseServerError(
            ERROR_PAGE_TEMPLATE % {'title': 'Server Error (500)', 'details': ''},
            content_type='text/html',
        )

Ensuite, la fonction à affecter à handler500 doit être une fonction différente au lieu de defaults.server_error.

Attribuer une fonction différente au handler500

  1. Définissez votre propre fonction server_error
  2. Affectez-le au handler500

Essayez de définir votre propre server_error dans views.py. Parce que l'original est défini dans django.views.defaults.

views.py


@requires_csrf_token
def my_customized_server_error(request, template_name='500.html'):
    return HttpResponseServerError('<h1>Server Error (500)C'est vrai</h1>')

L'affectation au handler500 se fait dans urls.py. La définition originale du handler500 se trouve dans django.conf.urls.

urls.py


handler500 = views.my_customized_server_error

J'ai pu modifier l'écran d'erreur du serveur.

django3.jpg

Après cela, vous pouvez écrire ce que vous voulez dans my_customized_server_error.

Exemple de my_customized_server_error

Code qui normalement «imprime».

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)C'est vrai</h1>')

Ce code affiche le même écran d'erreur que lorsque DEBUG = True. C'est facile à voir, n'est-ce pas? (Petite sensation)

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 qui affiche l'écran d'erreur du serveur par défaut (500) vu du visage du parent. Vous pouvez utiliser django.views.defaults.server_error que vous avez trouvé précédemment.

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 qui ignore les notifications sur le Slack préféré de tout le monde.

views.py


@requires_csrf_token
def my_customized_server_error(request, template_name='500.html'):
    import requests
    import json
    import traceback
    requests.post(
        'Votre URL Webhook Slack',
        data=json.dumps({
            'text': '\n'.join([
                f'Request uri: {request.build_absolute_uri()}',
                traceback.format_exc(),
            ]),
            'username': 'Notification d'erreur Django',
            'icon_emoji': ':jack_o_lantern:',
        })
    )
    return HttpResponseServerError('<h1>Server Error (500)C'est vrai</h1>')

J'ai volé. Puisque la structure des répertoires de ma place est affichée, je vais mettre une mosaïque.

django4.jpg

Le calendrier de l'avent Django de demain est @boxboxbax. Bonne chance!

Recommended Posts

Stratégie d'erreur du serveur Django (500) [Adcare 2019]
Erreur de version Django2.2 SQLite3
Erreur Django settings.py SECRET_KEY
Erreur: 500 (erreur de serveur interne) Jupyter lab
[Django] Créez votre propre page d'erreur 403, 404, 500