문제

나는 뛰고있어 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 템플릿과 사용자는 내부를 노출시키지 않고 특정 오류를 참조 할 수 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top