오류 보고를 관리하는 방법¶
공용 사이트를 실행할 때는 항상 :설정 기능을 해제해야 합니다.’DEBUG’ 설정입니다. 이렇게 하면 서버가 훨씬 더 빨리 실행될 수 있으며, 악성 사용자가 오류 페이지에서 나타날 수 있는 응용프로그램의 세부 정보를 볼 수 없게 됩니다.
그러나 :설정으로 실행:디버그가 “거짓”으로 설정된 것은 당신의 사이트에서 발생한 오류를 절대 보지 못한다는 것을 의미하며, 그 대신 모든 사람이 당신의 공개 오류 페이지를 보게 될 것이다. 배포된 사이트에서 발생하는 오류를 추적해야 하므로 Django가 이러한 오류에 대한 세부 정보가 포함된 보고서를 생성하도록 구성할 수 있습니다.
이메일 보고¶
서버 오류¶
시기:설정:DEBUG는 “False”이며, Django는 다음과 같은 설정에 나열된 사용자에게 e-메일을 보낼 것이다.코드가 처리되지 않은 예외를 발생시키고 내부 서버 오류가 발생할 때마다 ‘ADMIN’을 설정합니다( 엄밀히 말하면 HTTP 상태 코드가 500 이상인 응답의 경우). 이렇게 하면 관리자는 오류를 즉시 알 수 있습니다. :설정:’ADMIN’은 오류에 대한 설명, 완전한 Python 추적, 오류를 발생시킨 HTTP 요청에 대한 세부 정보를 얻을 것이다.
참고
전자 메일을 보내기 위해 Django는 메일 서버에 연결하는 방법을 알려주는 몇 가지 설정이 필요합니다. 최소한 설정:을 지정해야 합니다.’E-MAIL_HOST’ 및 가능한 설정:’EMAIL_HOST_USER’ 및 :설정:메일 서버의 구성에 따라 다른 설정이 필요할 수도 있지만 ‘EMAIL_HOST_PASSWORD’입니다. 이메일 관련 설정의 전체 목록은 :doc:’Django 설정 설명서’를 참조하십시오.
기본적으로 Django는 root@localhost에서 이메일을 전송합니다. 그러나 일부 메일 공급자는 이 주소의 모든 전자 메일을 거부합니다. 다른 발송인 주소를 사용하려면 :seting:’을 수정하십시오.SERVER_EMail’ 설정입니다.
이 동작을 활성화하려면 수신자의 전자 메일 주소를 : 설정에 입력하십시오.’ADMIN’ 설정.
더 보기
서버 오류 전자 메일은 로깅 프레임워크를 사용하여 전송되므로 :doc:’로그 구성 사용자 지정’을 통해 이 동작을 사용자 지정할 수 있습니다.
404 오류¶
끊어진 링크에 대한 전자 메일 오류(404 “페이지 없음” 오류)로 Django를 구성할 수도 있습니다. Django는 다음과 같은 경우 약 404개의 오류를 이메일로 전송합니다.
- :설정:`DEBUG` 는 “거짓”이다
- 설정:MIDDLEWARE 설정은
django.middleware.common.BrokenLinkEmailsMiddleware
.을 포함된다
이러한 조건이 충족되면 Django는 :seting에 나열된 사용자에게 e-메일을 보냅니다.당신의 코드가 404를 올리고 요청에 레퍼러가 있을 때마다 ‘매니저즈’가 설정된다. 참조자가 없는 404대에게는 이메일로 보내는 것이 귀찮지 않습니다. 대개는 고장난 URL이나 고장난 웹 봇을 타이핑하는 사람들이죠. 또한 레퍼러가 요청한 URL과 동일한 경우 404초도 무시합니다. 이 동작도 손상된 웹 봇에서 발생되기 때문입니다.
참고
LocaleMiddleware
또는 :setting:`MIDDLEWARE
설정의 맨 위에 놓으십시오.
: setting을 수정하여 Django에게 특정 404s에 대한 보고를 중지하라고 지시할 수 있습니다.IGNORABLE_404_URL의 설정입니다. 컴파일된 정규식 개체의 목록이어야 합니다.
import re
IGNORABLE_404_URLS = [
re.compile(r"\.(php|cgi)$"),
re.compile(r"^/phpmyadmin/"),
]
: 설정을 수정하여 Django에게 특정 404에 대한 보고를 중지하도록 지시할 수 있습니다.IGNERGABLE_404_URL에 대한 설정. 컴파일된 정규식 개체 목록이어야 합니다. 예:
다음 예에서는 브라우저 및 크롤러가 자주 요청하는 일부 기존 URL을 제외하는 방법을 보여 줍니다.
import re
IGNORABLE_404_URLS = [
re.compile(r"^/apple-touch-icon.*\.png$"),
re.compile(r"^/favicon\.ico$"),
re.compile(r"^/robots\.txt$"),
]
(참고로 이것들은 정규 표현식입니다. 그래서 우리는 그것들을 피하기 위해 기간 앞에 역슬래시를 붙였습니다.)
:class:`django.middleware.common의 동작을 사용자 지정하려면끊어진 링크 이메일 미들웨어의 추가(예: 웹 크롤러에서 오는 요청을 무시하려면)를 하위 분류하고 메소드를 재정의해야 합니다.
더 보기
404개의 오류는 로깅 프레임워크를 사용하여 기록됩니다. 기본적으로 이러한 로그 레코드는 무시되지만, 처리기와 :doc:’로그 구성’을 적절하게 작성하여 오류 보고에 사용할 수 있습니다.
오류 보고서 필터링¶
경고
중요한 데이터를 필터링하는 것은 어려운 문제이며 중요한 데이터가 오류 보고서에 유출되지 않도록 보장하는 것은 거의 불가능합니다. 따라서 오류 보고서는 신뢰할 수 있는 팀 구성원만 사용할 수 있어야 하며, 전자 메일 등의 인터넷을 통해 암호화되지 않은 오류 보고서를 전송하지 않아야 합니다.
중요한 정보 필터링¶
오류 보고서는 오류를 디버깅하는 데 매우 유용하므로 일반적으로 이러한 오류에 대한 관련 정보를 가능한 많이 기록하는 것이 유용합니다. 예를 들어, 기본적으로 Django는 제기된 예외에 대해 ‘full traceback’_, 각 ‘traceback frame’_의 로컬 변수 및 :class를 기록합니다.’~django.the’HttpRequest’s:ref:’attributes1’입니다.
그러나 때로는 특정 유형의 정보가 너무 민감하여 사용자의 암호 또는 신용 카드 번호와 같이 추적하기에 적절하지 않을 수 있다. 따라서 :설정의 설명에 따라 중요한 설정을 필터링하는 것 외에도 다음과 같은 작업을 수행할 수 있습니다.’DEBUG’ 설명서인 Django는 실운영 환경에서 오류 보고서(여기서: setting: setting:디버그는 func:’sensitive_variables’와 func:’sensitive_post_parameters’로 설정되어 있다.
-
sensitive_variables
(*variables)¶ 코드의 함수(보기 또는 일반 콜백)가 중요한 정보를 포함할 수 있는 로컬 변수를 사용하는 경우 “sensitive_variables” decorator를 사용하여 해당 변수 값이 오류 보고서에 포함되지 않도록 방지할 수 있습니다.
from django.views.decorators.debug import sensitive_variables @sensitive_variables("user", "pw", "cc") def process_info(user): pw = user.pass_word cc = user.credit_card_number name = user.name ...
위의 예에서 “user”, “pw” 및 “cc” 변수의 값은 오류 보고에 숨겨져 별(’*********)로 대체되며 “name” 변수의 값은 공개된다.
오류 로그에서 함수의 모든 로컬 변수를 체계적으로 숨기려면 “sensitive_variables” decorator에 어떤 인수도 제공하지 마십시오.
@sensitive_variables() def my_function(): ...
여러 개의 장식자를 사용하는 경우
숨기려는 변수가 함수 인수(예: 다음 예에서는 ‘user’ user’)이고, 장식된 함수에 여러 개의 장식기가 있는 경우, 반드시 “@sensitive_variables”를 장식자 체인의 맨 위에 놓아야 한다. 이렇게 하면 다른 장식자를 통과할 때 함수 인수도 숨겨집니다.
@sensitive_variables("user", "pw", "cc") @some_decorator @another_decorator def process_info(user): ...
경고
Due to the machinery needed to cross the sync/async boundary,
sync_to_async()
andasync_to_sync()
are not compatible withsensitive_variables()
.If using these adapters with sensitive variables, ensure to audit exception reporting, and consider implementing a custom filter if necessary.
-
sensitive_post_parameters
(*parameters)¶ 만약 당신의 견해를 피력하는을 받는다:수업:~django.http.HttpRequest 개체:항목을 보강:`POSTparameters<django.http.HttpRequest.POST>`민감한 정보를 담아 취약해 당신은 예방할 수 있다.이런 변수들의 오류 보고서도``sensitive_post_parameters”실내 장식가를 사용하여 포함되는에서 값::.
from django.views.decorators.debug import sensitive_post_parameters @sensitive_post_parameters("pass_word", "credit_card_number") def record_user_profile(request): UserProfile.create( user=request.user, password=request.POST["pass_word"], credit_card=request.POST["credit_card_number"], name=request.POST["name"], ) ...
위의 예에서 “pass_word”와 “credit_card_number” POST 매개 변수의 값은 오류 보고 내 요청 표현에 숨겨져 별(’****’)로 대체되며, “이름” 매개 변수의 값은 공개된다.
오류 보고서에서 요청의 모든 POST 매개 변수를 체계적으로 숨기려면 ``sensitive_post_parameters” 장식자에게 어떤 인수도 제공하지 마십시오.
@sensitive_post_parameters() def my_view(request): ...
모든 POST 매개 변수는 특정:mod:’django.contrib에 대한 오류 보고서에서 체계적으로 필터링됩니다.auth.password, ``password_reset_password”, “password_changes”, “add_view” 및 “user_change_password in ``auth 관리자”에서 보기 때문에 사용자 암호와 같은 중요한 정보가 유출되는 것을 방지할 수 있다.
사용자 정의 오류 리포트¶
func:’sensitive_variables’와 :func:’sensitive_post_parameters’ do는 각각 민감한 변수의 이름으로 장식된 함수에 주석을 달고 “HttpRequest” 객체에 민감한 POST 매개 변수의 이름으로 주석을 달기 때문에 오류가 발생할 때 이러한 민감한 정보가 보고서에서 필터링될 수 있다. 실제 필터링은 Django의 기본 오류 리포터 필터 :class:’django에 의해 수행됩니다.경치, 경치,경치SafeExceptionReporterFilter’. 이 필터는 오류 보고가 생성될 때 장식자의 주석을 사용하여 해당 값을 별(’****’)로 바꿉니다. 전체 사이트에 대해 이 기본 동작을 재정의하거나 사용자 지정하려면 사용자 고유의 필터 클래스를 정의하고 Django에게 :seting:을 통해 사용하도록 지시해야 합니다.’DEFAULT_EXTECTION_REPORTER_FILTER’ 설정:
DEFAULT_EXCEPTION_REPORTER_FILTER = "path.to.your.CustomExceptionReporterFilter"
또한 ``HttpRequest”의 ``exception_reporter_filter” 속성을 설정하여 어떤 필터를 어떤 뷰에서 사용할지 보다 세밀하게 제어할 수도 있다.
def my_view(request):
if request.user.is_authenticated:
request.exception_reporter_filter = CustomExceptionReporterFilter()
...
사용자 지정 필터 클래스는 :class:’django’에서 상속해야 합니다.경치, 경치,경치SafeExceptionReporterFilter’는 다음과 같은 특성 및 방법을 재정의할 수 있습니다.
-
class
SafeExceptionReporterFilter
¶ -
cleansed_substitute
¶ 중요한 값을 대체할 문자열 값입니다. 기본적으로 이것은 민감한 변수의 값을 별(’******’)로 바꿉니다.
설정 및 ``요청”을 일치시키는 데 사용되는 컴파일된 정규식 개체입니다.META의 가치는 민감한 것으로 간주되고 있습니다. 기본적으로 다음과 같습니다.
import re re.compile(r"API|TOKEN|KEY|SECRET|PASS|SIGNATURE|HTTP_COOKIE", flags=re.IGNORECASE)
Changed in Django 4.2:HTTP_COOKIE
was added.
-
is_active
(request)¶ :meth:’get_post_parameters’ 및 :meth:’get_traceback_frame_variables’에서 필터링을 활성화하기 위해 “True”를 반환합니다. 다음과 같은 경우 필터는 기본적으로 활성화됩니다.디버그는 거짓입니다. 민감한 ``요청”에 주목하십시오.META의 값은 :설정에서 설명한 대로 항상 민감한 설정값과 함께 필터링됩니다.’DEBUG’ 설명서입니다.
-
get_post_parameters
(request)¶ POST 매개 변수의 필터링된 사전을 반환합니다. 중요한 값은 다음과 같이 대체됩니다. attr:’cleaned_substitute’.
-
get_traceback_frame_variables
(request, tb_frame)¶ 지정된 추적 프레임에 대해 필터링된 로컬 변수 사전을 반환합니다. 중요한 값은 다음과 같이 대체됩니다. attr:’cleaned_substitute’.
-
필터링 이외의 오류 보고서를 사용자 정의해야 하는 경우 :setup을 정의하여 사용자 정의 오류 보고자 클래스를 지정할 수 있습니다.’DEF_EXPECTION_REPORT’ 설정은 다음과 같습니다.
DEFAULT_EXCEPTION_REPORTER = "path.to.your.CustomExceptionReporter"
예외 리포터는 예외 리포트 데이터를 컴파일하여 텍스트 또는 HTML로 적절하게 포맷할 책임이 있습니다. (예외 리포터는 : setting:예외 리포트 데이터를 준비할 때 ‘DEFAT_REPORTER_FILTER’를 입력하세요.)
사용자 정의 리포터 클래스는 django.views.debug.ExceptionReporter
.에서 상속해야 합니다.
-
class
ExceptionReporter
¶ -
html_template_path
¶ 예외의 HTML 표현을 렌더링하기 위한 템플릿에 대한 절대 파일 시스템 경로를 나타내는 클래스:`pathlib.Path`를 반환하는 property입니다. Django 제공 템플릿의 기본값입니다.
-
text_template_path
¶ 예외의 일반 텍스트 표현을 렌더링하기 위한 템플릿에 대한 절대 파일 시스템 경로를 나타내는 클래스:`pathlib.Path`를 반환하는 property입니다. Django 제공 템플릿의 기본값입니다.
-
get_traceback_data
()¶ 추적 정보가 들어 있는 사전을 반환합니다.
예외 보고서를 사용자 지정하기 위한 기본 확장 지점입니다. 예:
from django.views.debug import ExceptionReporter class CustomExceptionReporter(ExceptionReporter): def get_traceback_data(self): data = super().get_traceback_data() # ... remove/add something here ... return data
-
get_traceback_html
()¶ 예외 보고서의 HTML 버전을 반환합니다.
디버그 500 HTTP 오류 페이지의 HTML 버전에 사용됩니다.
-
get_traceback_text
()¶ 예외 보고서의 일반 텍스트 버전을 반환합니다.
디버그 500 HTTP 오류 페이지 및 전자 메일 보고서의 일반 텍스트 버전에 사용됩니다.
-
필터 클래스와 마찬가지로 “HttpRequest”의 “exception_reporter_class” 속성을 설정하여 지정된 보기 내에서 사용할 예외 리포터 클래스를 제어할 수 있습니다.
def my_view(request):
if request.user.is_authenticated:
request.exception_reporter_class = CustomExceptionReporter()
...
더 보기
또한 :ref의 사용자 정의 부분을 작성하여 사용자 정의 오류 보고를 설정할 수도 있습니다.’중략 미들웨어’입니다. 사용자 정의 오류 처리를 작성하는 경우 다음과 같은 경우 Django의 기본 오류 처리를 에뮬레이트하는 것이 좋습니다.디버그는 거짓입니다.