2013-02-21 53 views
1

Django {%url%} templatetag無法反轉提供的URL時引發NoReverseMatch錯誤。這在開發中非常有用,但是在製作過程中,這會使用戶停下腳步,導致500頁錯誤,阻止整個頁面,並導致他們認爲我們的網站已損壞。使django url標記無提示失敗

模板開發人員不應該能夠打印整個網站的錯字。我想要做的就是透明地覆蓋這種行爲,這樣僅在生產環境中,如果找不到反向匹配,它會輸出一個默認url,如「#」,並將錯誤報告給我們的後臺異常跟蹤系統,但仍然可以讓用戶在不增加500錯誤的情況下繼續做他們正在做的事情。

有沒有辦法用我自己的安全版本來透明地替換默認的{%url%}標籤?我不想在網站上的每個模板的頂部添加{%load my_custom_url_tag%},因爲在某些時候人們會忘記,而且標記的行爲將是相同的,唯一的區別在於它如何處理錯誤。

回答

1

通過實現自己的url標記,你打開了許多前向兼容性問題。我的建議是添加自定義500錯誤處理程序,而不是:https://docs.djangoproject.com/en/1.4/topics/http/views/#the-500-server-error-view

我認爲如果模板開發人員犯了一個錯字,我實際上會希望視圖發出錯誤。試圖掩蓋這種行爲似乎不合邏輯 - 是不是有足夠的理由進行一些簡單的單元測試,以確保您的視圖至少返回200響應代碼?

+0

我們已經有一個自定義的500錯誤頁面,向我們報告NoReverseMatch錯誤。它將以任何方式進行跟蹤。我不希望發生的事情是讓用戶被阻止,無論他們試圖做什麼,並抱怨說整個網站已關閉,僅僅是因爲某個編輯器在一段副本中放了一個錯誤的{%url%}標記。我希望它是一樣無足輕重,就好像有人在頁面中放入了一個破損的標籤。 – LS55321 2013-02-21 14:30:11

+0

我不明白的是爲什麼你會讓代碼沒有投入生產。 – Brandon 2013-02-21 14:31:13

+0

通過該邏輯,任何複製中存在拼寫錯誤的頁面也應該引發500錯誤。 – LS55321 2013-02-21 14:37:01

4

您可以在靜默模式下使用內置的url標記,嘗試查找,然後使用找到的內容爲—的URL。

Django docs

如果視圖中缺少這{% url ... as var %}語法不會導致錯誤。在實踐中,你會使用這個鏈接到的意見是可選:

​​

希望有所幫助。

+0

太糟糕了,重寫是不可能的,因爲解決你的問題的代碼很長! – benzkji 2017-09-11 09:07:10