在運行公共站點時,應(yīng)始終關(guān)閉該 DEBUG設(shè)置。這將使您的服務(wù)器運行得更快,并且還可以防止惡意用戶查看錯誤頁面可能顯示的應(yīng)用程序詳細信息。
但是,DEBUG將set 運行為False表示您將永遠不會看到站點生成的錯誤-每個人都將看到您的公共錯誤頁面。您需要跟蹤部署站點中發(fā)生的錯誤,因此可以將Django配置為創(chuàng)建包含有關(guān)這些錯誤的詳細信息的報告。
當(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ā)送的,因此您可以通過自定義日志記錄配置來自定義此行為。
Django也可以配置為通過電子郵件發(fā)送有關(guān)斷開鏈接的錯誤(404“找不到頁面”錯誤)。Django在以下情況下發(fā)送有關(guān)404錯誤的電子郵件:
如果滿足這些條件,則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
,pw
和cc
變量將被隱藏,并用星(替換**********
)錯誤的報告,而值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 parameters
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'], ) ...
在上面的示例中,錯誤報告內(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_confirm
,password_change
,和add_view
和 user_change_password
在auth
管理員),以防止敏感信息泄漏的諸如用戶密碼。
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_variables
(request,tb_frame)返回給定回溯幀的局部變量的過濾字典。默認(rèn)情況下,它將敏感變量的值替換為star(**********
)。
也可以看看
您還可以通過編寫自定義的異常中間件來設(shè)置自定義錯誤報告 。如果您確實編寫了自定義錯誤處理,則最好模擬Django的內(nèi)置錯誤處理,如果DEBUG是,則僅報告/記錄錯誤False。
詳情參考: https://docs.djangoproject.com/en/3.0/
更多建議: