花幾分鐘時間欣賞一下我們寫好的Web應用程序,然后我們再來搞點小破壞。 我們故意在 views.py 文件中引入一項 Python 錯誤,注釋掉 hours_ahead 視圖中的 offset = int(offset) 一行。
def hours_ahead(request, offset): # try: # offset = int(offset) # except ValueError: # raise Http404() dt = datetime.datetime.now() + datetime.timedelta(hours=offset) html = "<html><body>In %s hour(s), it will be %s.</body></html>" % (offset, dt) return HttpResponse(html)
啟動開發服務器,然后訪問 /time/plus/3/ 。你會看到一個包含大量信息的出錯頁,最上面 的一條 TypeError 信息是: "unsupported type for timedelta hours component: unicode" .
怎么回事呢? 是的, datetime.timedelta 函數要求 hours 參數必須為整型, 而我們注釋掉了將 offset 轉為整型的代碼。 這樣導致 datetime.timedelta 彈出 TypeError 異常。
這個例子是為了展示 Django 的出錯頁面。 我們來花些時間看一看這個出錯頁,了解一下其中 給出了哪些信息。
以下是值得注意的一些要點:
Django 的出錯頁某些情況下有能力顯示更多的信息,比如模板語法錯誤。 我們討論 Django 模板系統時再說它們。 現在,取消 offset = int(offset) 這行的注釋,讓它重新正常 工作。
不知道你是不是那種使用小心放置的 print 語句來幫助調試的程序員? 你其實可以用 Django 出錯頁來做這些,而不用 print 語句。 在你視圖的任何位置,臨時插入一個 assert False 來觸發出錯頁。 然后,你就可以看到局部變量和程序語句了。 這里有個使用hours_ahead視圖的例子:
def hours_ahead(request, offset): try: offset = int(offset) except ValueError: raise Http404() dt = datetime.datetime.now() + datetime.timedelta(hours=offset) assert False html = "<html><body>In %s hour(s), it will be %s.</body></html>" % (offset, dt) return HttpResponse(html)
最后,很顯然這些信息很多是敏感的,它暴露了你 Python 代碼的內部結構以及 Django 配置,在 Internet 上公開這信息是很愚蠢的。 不懷好意的人會嘗試使用它攻擊你的 Web 應用程序,做些下流之事。 因此,Django 出錯信息僅在 debug 模式下才會顯現。 我們稍后 說明如何禁用 debug 模式。 現在,你只要知道 Django 服務器在你開啟它時默認運行在 debug 模式就行了。 (聽起來很熟悉? 頁面沒有發現錯誤,如前所述,工作正常。)
新聞熱點
疑難解答
圖片精選