錯誤報告

2022-07-20 17:56 更新

錯誤報告

在運行公共站點時,應(yīng)始終關(guān)閉該 DEBUG設(shè)置。這將使您的服務(wù)器運行得更快,并且還可以防止惡意用戶查看錯誤頁面可能顯示的應(yīng)用程序詳細信息。

但是,DEBUG將set 運行為False表示您將永遠不會看到站點生成的錯誤-每個人都將看到您的公共錯誤頁面。您需要跟蹤部署站點中發(fā)生的錯誤,因此可以將Django配置為創(chuàng)建包含有關(guān)這些錯誤的詳細信息的報告。

電子郵件報告

服務(wù)器錯誤

當(dāng)DEBUGis時False,ADMINS只要您的代碼引發(fā)未處理的異常并導(dǎo)致內(nèi)部服務(wù)器錯誤(嚴(yán)格來說,對于HTTP狀態(tài)代碼為500或更高的任何響應(yīng)),Django都會通過電子郵件發(fā)送設(shè)置中列出的用戶 。這會給管理員立即通知任何錯誤。該ADMINS會得到錯誤的描述,一個完整的Python追蹤,以及有關(guān)導(dǎo)致錯誤的HTTP請求的詳細信息。

注意: 為了發(fā)送電子郵件,Django需要一些設(shè)置來告訴它如何連接到您的郵件服務(wù)器。至少,您需要指定,EMAIL_HOST并且可能 需要EMAIL_HOST_USER和EMAIL_HOST_PASSWORD,盡管根據(jù)您的郵件服務(wù)器的配置,可能還需要其他設(shè)置。有關(guān)與電子郵件相關(guān)的設(shè)置的完整列表,請參閱Django設(shè)置文檔。

默認(rèn)情況下,Django將通過root @ localhost發(fā)送電子郵件。但是,某些郵件提供商拒絕來自該地址的所有電子郵件。要使用其他發(fā)件人地址,請修改SERVER_EMAIL設(shè)置。

要激活此行為,請將收件人的電子郵件地址放入 ADMINS設(shè)置中。

也可以看看

服務(wù)器錯誤電子郵件是使用日志記錄框架發(fā)送的,因此您可以通過自定義日志記錄配置來自定義此行為。

404錯誤

Django也可以配置為通過電子郵件發(fā)送有關(guān)斷開鏈接的錯誤(404“找不到頁面”錯誤)。Django在以下情況下發(fā)送有關(guān)404錯誤的電子郵件:

  • DEBUG是False;
  • 您的MIDDLEWARE設(shè)置包括 django.middleware.common.BrokenLinkEmailsMiddleware。

如果滿足這些條件,則MANAGERS只要您的代碼引發(fā)404并且請求具有引薦來源,Django就會通過電子郵件將設(shè)置中列出的用戶發(fā)送給 您。不用電子郵件發(fā)送沒有推薦人的404,這些人通常是輸入損壞的URL或損壞的Web bot的人。當(dāng)引用者等于請求的URL時,它也會忽略404,因為此行為也來自損壞的Web機器人。

注意: BrokenLinkEmailsMiddleware必須出現(xiàn)在攔截404錯誤的其他中間件之前,例如 LocaleMiddleware或 FlatpageFallbackMiddleware。將其放在MIDDLEWARE設(shè)置的頂部。

您可以通過調(diào)整IGNORABLE_404_URLS設(shè)置來告訴Django停止報告特定的404 。它應(yīng)該是已編譯的正則表達式對象的列表。例如:

import re
IGNORABLE_404_URLS = [
    re.compile(r'\.(php|cgi)$'),
    re.compile(r'^/phpmyadmin/'),
]

在此示例中,任何以.php或結(jié)尾的URL的404 .cgi都不會被報告。以開頭的網(wǎng)址也不會/phpmyadmin/。

以下示例顯示了如何排除瀏覽器和搜尋器經(jīng)常請求的一些常規(guī)URL:

import re
IGNORABLE_404_URLS = [
    re.compile(r'^/apple-touch-icon.*\.png$'),
    re.compile(r'^/favicon\.ico$'),
    re.compile(r'^/robots\.txt$'),
]

(請注意,這些是正則表達式,因此我們在句點前加了一個反斜杠以將其轉(zhuǎn)義。)

如果您想django.middleware.common.BrokenLinkEmailsMiddleware進一步自定義行為 (例如忽略來自Web爬網(wǎng)程序的請求),則應(yīng)將其子類化并覆蓋其方法。

也可以看看

使用日志記錄框架記錄404錯誤。默認(rèn)情況下,這些日志記錄將被忽略,但是您可以通過編寫處理程序并適當(dāng)配置日志記錄來將它們用于錯誤報告。

過濾錯誤報告

警告:篩選敏感數(shù)據(jù)是一個難題,幾乎不可能保證敏感數(shù)據(jù)不會泄漏到錯誤報告中。因此,錯誤報告僅應(yīng)提供給受信任的團隊成員,并且您應(yīng)避免通過Internet(例如通過電子郵件)傳輸未經(jīng)加密的錯誤報告。

過濾敏感信息

錯誤報告對于調(diào)試錯誤確實很有幫助,因此通常記錄盡可能多的有關(guān)這些錯誤的相關(guān)信息非常有用。例如,默認(rèn)情況下,Django會記錄引發(fā)的異常的完整追溯,每個追溯框架的局部變量以及 HttpRequest的屬性。

但是,有時某些類型的信息可能過于敏感,因此可能不適用于跟蹤例如用戶的密碼或信用卡號。因此,除了按照DEBUG文檔中所述過濾掉似乎敏感的設(shè)置之外,Django還提供了一組函數(shù)裝飾器,以幫助您控制應(yīng)從生產(chǎn)環(huán)境中的錯誤報告中過濾掉哪些信息(即在何處 DEBUG設(shè)置為False):sensitive_variables()和 sensitive_post_parameters()。

sensitive_variables*變量

如果代碼中的函數(shù)(視圖或任何常規(guī)回調(diào))使用易于包含敏感信息的局部變量,則可以使用sensitive_variables裝飾器防止這些變量的值包含在錯誤報告中:

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,pwcc 變量將被隱藏,并用星(替換**********)錯誤的報告,而值name變量將被公開。

要從錯誤日志中系統(tǒng)地隱藏函數(shù)的所有局部變量,請不要向sensitive_variables裝飾器提供任何參數(shù):

@sensitive_variables()
def my_function():
    ...

使用多個裝飾器時

如果要隱藏的變量也是函數(shù)參數(shù)(例如user,在下面的示例中為“ ”),并且如果修飾的函數(shù)具有多個修飾符,則請確保將其放置@sensitive_variables 在修飾符鏈的頂部。這樣,當(dāng)它通過其他裝飾器傳遞時,它還將隱藏函數(shù)參數(shù):

@sensitive_variables('user', 'pw', 'cc')
@some_decorator
@another_decorator
def process_info(user):
    ...
sensitive_post_parameters* parameters

如果您的一個視圖接收到一個易受敏感信息影響的HttpRequest對象,則可以使用裝飾器阻止這些參數(shù)的值包含在錯誤報告中 :POST parameterssensitive_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'],
    )
    ...

在上面的示例中,錯誤報告內(nèi)的請求表示中,pass_word和 credit_card_number參數(shù)的值將被隱藏并用星號(**********)替換,而該name參數(shù)的值將被公開。

要在錯誤報告中系統(tǒng)地隱藏請求的所有POST參數(shù),請不要向sensitive_post_parameters裝飾器提供任何參數(shù):

@sensitive_post_parameters()
def my_view(request):
    ...

所有POST參數(shù)被系統(tǒng)過濾的某些錯誤報告出來django.contrib.auth.views次(login, password_reset_confirmpassword_change,和add_view和 user_change_passwordauth管理員),以防止敏感信息泄漏的諸如用戶密碼。

自定義錯誤報告

All sensitive_variables()和sensitive_post_parameters()do分別用敏感變量的名稱注釋修飾的函數(shù),并HttpRequest用敏感的POST參數(shù)的名稱注釋對象,以便以后在發(fā)生錯誤時可以從報告中過濾掉此敏感信息。實際的過濾是由Django的默認(rèn)錯誤報告過濾器完成的 django.views.debug.SafeExceptionReporterFilter。**********生成錯誤報告時,此過濾器使用修飾符的注釋將相應(yīng)的值替換為star()。如果您希望為整個網(wǎng)站覆蓋或自定義此默認(rèn)行為,則需要定義自己的過濾器類,并告訴Django通過以下DEFAULT_EXCEPTION_REPORTER_FILTER設(shè)置使用它 :

DEFAULT_EXCEPTION_REPORTER_FILTER = 'path.to.your.CustomExceptionReporterFilter'

您還可以通過設(shè)置HttpRequest的exception_reporter_filter 屬性,以更精細的方式控制要在任何給定視圖中使用的過濾器:

def my_view(request):
    if request.user.is_authenticated:
        request.exception_reporter_filter = CustomExceptionReporterFilter()
    ...

您的自定義過濾器類需要繼承 django.views.debug.SafeExceptionReporterFilter并可以覆蓋以下方法:

SafeExceptionReporterFilter
SafeExceptionReporterFilter.is_active請求

返回True以激活其他方法中操作的過濾。默認(rèn)情況下,如果DEBUG為,則過濾器處于活動狀態(tài)False。

SafeExceptionReporterFilter.get_post_parameters請求

返回過濾后的POST參數(shù)字典。默認(rèn)情況下,它將敏感參數(shù)的值替換為星號(**********)。

SafeExceptionReporterFilter.get_traceback_frame_variablesrequesttb_frame

返回給定回溯幀的局部變量的過濾字典。默認(rèn)情況下,它將敏感變量的值替換為star(**********)。

也可以看看

您還可以通過編寫自定義的異常中間件來設(shè)置自定義錯誤報告 。如果您確實編寫了自定義錯誤處理,則最好模擬Django的內(nèi)置錯誤處理,如果DEBUG是,則僅報告/記錄錯誤False。

詳情參考: https://docs.djangoproject.com/en/3.0/


以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號