오류 보고를 관리하는 방법

공용 사이트를 실행할 때는 항상 :설정 기능을 해제해야 합니다.’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개의 오류를 이메일로 전송합니다.

이러한 조건이 충족되면 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): ...
Changed in Django 5.0:

Support for wrapping async functions was added.

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 관리자”에서 보기 때문에 사용자 암호와 같은 중요한 정보가 유출되는 것을 방지할 수 있다.

Changed in Django 5.0:

Support for wrapping async functions was added.

사용자 정의 오류 리포트

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

중요한 값을 대체할 문자열 값입니다. 기본적으로 이것은 민감한 변수의 값을 별(’******’)로 바꿉니다.

hidden_settings

설정 및 ``요청”을 일치시키는 데 사용되는 컴파일된 정규식 개체입니다.META의 가치는 민감한 것으로 간주되고 있습니다. 기본적으로 다음과 같습니다.

import re

re.compile(r"API|TOKEN|KEY|SECRET|PASS|SIGNATURE|HTTP_COOKIE", flags=re.IGNORECASE)
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의 기본 오류 처리를 에뮬레이트하는 것이 좋습니다.디버그는 거짓입니다.

Back to Top