C'est ma première participation au calendrier de l'Avent. J'ai hâte de travailler avec vous.
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) **.
À 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.
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.
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.
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.
Après cela, vous pouvez écrire ce que vous voulez dans 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.
Le calendrier de l'avent Django de demain est @boxboxbax. Bonne chance!