Tak, możesz ręcznie wysłać raport o błędach e-mail, nawet jeśli zauważysz wyjątek.
Istnieje kilka sposobów na osiągnięcie tego celu.
- Można wykorzystać istniejącą domyślną konfigurację rejestratora (oraz związany z nim układ obsługi, udokumentowany here) dla django.request który wysyła wszystkie komunikaty o błędach do obsługi mail_admins, który wysyła niczego zalogowany z log.error z Django. Żądanie, gdy debugowanie jest fałszywe jako wiadomość e-mail przy użyciu adresu AdminEmailHandler, którego obecny punkt połączenia znajduje się pod numerem handle_uncaught_exception.
- Możesz dodać dodatkową konfigurację rejestratora, która używa tej samej procedury obsługi, aby wychwycić wyjątek wcześniej niż django.request i wywołać log.error wcześniej.
- Możesz podać podklasę django.request, w szczególności handle_uncaught_exception.
- Można użyć niestandardowego middleware (for example StandardExceptionMiddleware) lub ExceptionMiddleware
- Można ręcznie zadzwonić zawartość EMIT w
AdminEmailHandler
lub mail.mail_admins bezpośrednio.
Z tych opcji wydaje się, że najpopularniejsze jest rozwiązanie 4.
Na podstawie dodatkowych informacji w komentarzu przykład kodu 2 znajduje się poniżej.
Pierwszy kod, który zostanie dodany do wyświetlenia
from django.http import HttpResponse
import logging
logger = logging.getLogger(__name__)
def my_view(request):
try:
result = do_something()
return HttpResponse('<h1>Page was found' + result + '</h1>')
except Exception:
# Can have whatever status_code and title you like, but I was just matching the existing call.
logger.error('Internal Server Error: %s', request.path,
exc_info=sys.exc_info(),
extra={
'status_code': 500,
'request': request
}
)
return HttpResponse('<h1>Page was found, and exception was mailed to admins.</h1>')
ten oparty jest o Django documentation for view writing i and introduction to Django logging, ale nie został przetestowany.
Wtedy dodatkowa konfiguracja rejestratora jest dodać do wejścia wywożący drewno (jak za here)
'nameofdjangoapplicationgoeshere': {
'handlers': ['mail_admins'],
'level': 'ERROR',
'propagate': False,
},
Najsłodszy! I chociaż żadna odpowiedź nie wygenerowała dokładnie raportu o błędzie, który jest generowany automatycznie, to podejście dało najwięcej informacji. Jest to podobne do strony błędów Django wyświetlającej się z 'DEBUG = True' – frnhr
Otrzymuję błąd w wierszu 9. Mówi:" Obiekt "wyjątek" nie ma atrybutu "wiadomość". –
dodano edycję, aby działała dla python 3 – maxbellec