내 django 500.html 페이지에 스택 트레이스를 어떻게 포함합니까?
-
02-07-2019 - |
문제
나는 뛰고있어 Django 1.0
그리고 저는 앱을 배포하는 데 가깝습니다. 따라서 디버그 설정을 False로 변경하겠습니다.
그렇게 말하면서, 나는 오류가 발생할 때 500.html 페이지에 스택 트레이스를 포함 시키려고합니다. 그렇게함으로써 사용자는 오류를 복사하고 붙여 넣고 개발자에게 쉽게 이메일을 보낼 수 있습니다.
이 문제에 가장 적합한 방법에 대한 생각이 있습니까?
해결책
그런 식으로 500을 자동으로 기록하십시오.
- 당신은 그들이 언제 일어날 지 알고 있습니다.
- 스택 트레이스를 보내는 사용자에게 의존 할 필요가 없습니다.
Joel은 애플리케이션이 실패를 경험할 때 버그 추적기에서 자동으로 티켓을 작성하는 한 멀리 갈 것을 권장합니다. 개인적으로, 나는 개발자가 구독 할 수있는 스택 트레이스, URL 등으로 (개인) RSS 피드를 만듭니다.
반면에 사용자에게 스택 추적을 표시하면 악의적 인 사용자가 사이트를 공격하는 데 사용할 수있는 정보가 유출 될 수 있습니다. 지나치게 상세한 오류 메시지는 SQL 주입 공격의 고전적인 디딤돌 중 하나입니다.
편집하다 (추적을 캡처하기 위해 코드 샘플 추가) :
sys.exc_info 호출에서 예외 정보를 얻을 수 있습니다. 디스플레이의 트레이스 백이 포맷하는 동안 Traceback 모듈에서 나옵니다.
import traceback
import sys
try:
raise Exception("Message")
except:
type, value, tb = sys.exc_info()
print >> sys.stderr, type.__name__, ":", value
print >> sys.stderr, '\n'.join(traceback.format_tb(tb))
인쇄물:
Exception : Message
File "exception.py", line 5, in <module>
raise Exception("Message")
다른 팁
@zacherates가 말했듯이, 당신은 실제로 사용자에게 스택 트레이스를 표시하고 싶지 않습니다. 이 문제에 대한 가장 쉬운 접근법은 자신과 개발자가 이메일 주소가있는 관리자 설정에 나열된 경우 Django가 기본적으로하는 일입니다. Debug = False의 500 오류가 발생할 때마다 전체 스택 추적 (및 기타)으로 해당 목록의 모든 사람에게 이메일을 보냅니다.
생성 된 예외를 보여 주려면 템플릿 (500.html)에서 자신의 500보기를 작성하여 예외를 잡고 500 템플릿으로 전달할 수 있습니다.
단계 :
# in views.py :
import sys,traceback
def custom_500(request):
t = loader.get_template('500.html')
print sys.exc_info()
type, value, tb = sys.exc_info()
return HttpResponseServerError(t.render(Context({
'exception_value': value,
'value':type,
'tb':traceback.format_exception(type, value, tb)
},RequestContext(request))))
# main urls.py에서 :
from django.conf.urls.defaults import *
handler500 = 'project.web.services.views.custom_500'
# 템플릿에서 (500.html) :
{{ exception_value }}{{value}}{{tb}}
그것에 대한 자세한 내용은 다음과 같습니다. https://docs.djangoproject.com/en/dev/topics/http/views/#the-500-server-error-view
당신은 전화 할 수 있습니다 sys.exc_info()
사용자 정의 예외 핸들러에서. 그러나 나는 그것을 추천하지 않습니다. Django는 예외를 위해 이메일을 보낼 수 있습니다.
나는 이것이 오래된 질문이라는 것을 알고 있지만 요즘에는 다음과 같은 서비스를 사용하는 것이 좋습니다. 보초 오류를 캡처합니다.
Django에서이를 설정하는 단계는 엄청나게 간단합니다. 에서 문서:
- Raven을 사용하여 설치하십시오
pip install raven
- 추가하다
'raven.contrib.django.raven_compat'
너의 ~에게settings.INSTALLED_APPS
. - 추가하다
RAVEN_CONFIG = {"dsn": YOUR_SENTRY_DSN}
설정에.
그런 다음 500 페이지 (정의) handler500
), 전달 request.sentry.id
템플릿과 사용자는 내부를 노출시키지 않고 특정 오류를 참조 할 수 있습니다.