Django中處理出錯(cuò)頁面的方法
花幾分鐘時(shí)間欣賞一下我們寫好的Web應(yīng)用程序,然后我們?cè)賮砀泓c(diǎn)小破壞。 我們故意在 views.py 文件中引入一項(xiàng) Python 錯(cuò)誤,注釋掉 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)
啟動(dòng)開發(fā)服務(wù)器,然后訪問 /time/plus/3/ 。你會(huì)看到一個(gè)包含大量信息的出錯(cuò)頁,最上面 的一條 TypeError 信息是: "unsupported type for timedelta hours component: unicode" .
怎么回事呢? 是的, datetime.timedelta 函數(shù)要求 hours 參數(shù)必須為整型, 而我們注釋掉了將 offset 轉(zhuǎn)為整型的代碼。 這樣導(dǎo)致 datetime.timedelta 彈出 TypeError 異常。
這個(gè)例子是為了展示 Django 的出錯(cuò)頁面。 我們來花些時(shí)間看一看這個(gè)出錯(cuò)頁,了解一下其中 給出了哪些信息。
以下是值得注意的一些要點(diǎn):
- 在頁面頂部,你可以得到關(guān)鍵的異常信息: 異常數(shù)據(jù)類型、異常的參數(shù) (如本例中的 "unsupported type" )、在哪個(gè)文件中引發(fā)了異常、出錯(cuò)的行號(hào)等等。
- 在關(guān)鍵異常信息下方,該頁面顯示了對(duì)該異常的完整 Python 追蹤信息。 這類似于你在 Python 命令行解釋器中獲得的追溯信息,只不過后者更具交互性。 對(duì)棧中的每一幀,Django 均顯示了其文件名、函數(shù)或方法名、行號(hào)及該行源代碼。
- 點(diǎn)擊該行代碼 (以深灰色顯示),你可以看到出錯(cuò)行的前后幾行,從而得知相關(guān)上下文情況。
- 點(diǎn)擊棧中的任何一幀的“Local vars”可以看到一個(gè)所有局部變量的列表,以及在出錯(cuò) 那一幀時(shí)它們的值。 這些調(diào)試信息相當(dāng)有用。
- 注意“Traceback”下面的“Switch to copy-and-paste view”文字。 點(diǎn)擊這些字,追溯會(huì) 切換另一個(gè)視圖,它讓你很容易地復(fù)制和粘貼這些內(nèi)容。 當(dāng)你想同其他人分享這些異常 追溯以獲得技術(shù)支持時(shí)(比如在 Django 的 IRC 聊天室或郵件列表中),可以使用它。
- 你按一下下面的“Share this traceback on a public Web site”按鈕,它將會(huì)完成這項(xiàng)工作。 點(diǎn)擊它以傳回追溯信息至http://www.dpaste.com/,在那里你可以得到一個(gè)單獨(dú)的URL并與其他人分享你的追溯信息。
- 接下來的“Request information”部分包含了有關(guān)產(chǎn)生錯(cuò)誤的 Web 請(qǐng)求的大量信息: GET 和 POST、cookie 值、元數(shù)據(jù)(象 CGI 頭)。 在附錄H里給出了request的對(duì)象的 完整參考。
- Request信息的下面,“Settings”列出了 Django 使用的具體配置信息。 (我們已經(jīng)提及過ROOT_URLCONF,接下來我們將向你展示各式的Django設(shè)置。 附錄D覆蓋了所有可用的設(shè)置。)
Django 的出錯(cuò)頁某些情況下有能力顯示更多的信息,比如模板語法錯(cuò)誤。 我們討論 Django 模板系統(tǒng)時(shí)再說它們。 現(xiàn)在,取消 offset = int(offset) 這行的注釋,讓它重新正常 工作。
不知道你是不是那種使用小心放置的 print 語句來幫助調(diào)試的程序員? 你其實(shí)可以用 Django 出錯(cuò)頁來做這些,而不用 print 語句。 在你視圖的任何位置,臨時(shí)插入一個(gè) assert False 來觸發(fā)出錯(cuò)頁。 然后,你就可以看到局部變量和程序語句了。 這里有個(gè)使用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 代碼的內(nèi)部結(jié)構(gòu)以及 Django 配置,在 Internet 上公開這信息是很愚蠢的。 不懷好意的人會(huì)嘗試使用它攻擊你的 Web 應(yīng)用程序,做些下流之事。 因此,Django 出錯(cuò)信息僅在 debug 模式下才會(huì)顯現(xiàn)。 我們稍后 說明如何禁用 debug 模式。 現(xiàn)在,你只要知道 Django 服務(wù)器在你開啟它時(shí)默認(rèn)運(yùn)行在 debug 模式就行了。 (聽起來很熟悉? 頁面沒有發(fā)現(xiàn)錯(cuò)誤,如前所述,工作正常。)
相關(guān)文章
Python面向?qū)ο蟪绦蛟O(shè)計(jì)OOP入門教程【類,實(shí)例,繼承,重載等】
這篇文章主要介紹了Python面向?qū)ο蟪绦蛟O(shè)計(jì)OOP入門教程,較為詳細(xì)的分析了Python面向?qū)ο箢?實(shí)例,繼承,重載等相關(guān)概念與使用技巧,需要的朋友可以參考下2019-01-01python學(xué)習(xí)入門細(xì)節(jié)知識(shí)點(diǎn)
我們整理了關(guān)于python入門學(xué)習(xí)的一些細(xì)節(jié)知識(shí)點(diǎn),對(duì)于學(xué)習(xí)python的初學(xué)者很有用,一起學(xué)習(xí)下。2018-03-03Django 博客實(shí)現(xiàn)簡(jiǎn)單的全文搜索的示例代碼
這篇文章主要介紹了Django 博客實(shí)現(xiàn)簡(jiǎn)單的全文搜索的示例代碼,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-02-02Python使用difflib標(biāo)準(zhǔn)庫實(shí)現(xiàn)查找文本間的差異
在文本處理和比較中,查找文本之間的差異是一項(xiàng)常見的任務(wù),本文將詳細(xì)介紹如何使用difflib模塊來查找文本之間的差異,包括單行和多行文本的比較、生成差異報(bào)告,需要的可以參考下2024-03-03Pytorch的torch.nn.embedding()如何實(shí)現(xiàn)詞嵌入層
這篇文章主要介紹了Pytorch的torch.nn.embedding()如何實(shí)現(xiàn)詞嵌入層問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-02-02Python 實(shí)現(xiàn)進(jìn)度條的六種方式
這篇文章主要介紹了Python 實(shí)現(xiàn)進(jìn)度條的六種方式,幫助大家更好的理解和使用python,感興趣的朋友可以了解下2021-01-01Python Django form 組件動(dòng)態(tài)從數(shù)據(jù)庫取choices數(shù)據(jù)實(shí)例
這篇文章主要介紹了Python Django form 組件動(dòng)態(tài)從數(shù)據(jù)庫取choices數(shù)據(jù)實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2020-05-05Django外鍵(ForeignKey)操作以及related_name的作用詳解
這篇文章主要介紹了Django外鍵(ForeignKey)操作以及related_name的作用詳解,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-07-07