2011-10-10 76 views
1

我注意到Django的flatpages應用程序有趣的事情:它允許core/handlers/base.py登錄警告Not Found: $page。因此,我的Sentry日誌已滿404個合法和工作頁面。它似乎發生是因爲第一個Django記錄了404,然後它返回了一個HttpResponseNotFound對象,然後該頁面中間件開始並返回適當的200響應。爲什麼Django的flatpages允許記錄404錯誤?

這是我可以考慮在Django中的錯誤?我的推理是,有效的flatpage不是缺頁,因此不應記錄404消息。沒有其他方法可以捕獲404而不會將其記錄爲丟失?

回答

1

這不是一個錯誤,它是django flatpages應用程序的工作方式:它的中間件從網址404開始。這就是爲什麼你的哨兵裝滿了404。

考慮不要在哨兵中註冊404。 :/我沒有在這裏看到任何其他的方式。

有可能是另一種解決方案:而不是使用middleware嘗試包括flatpages.urls你的URL模式的結束

+0

問題是:我想註冊我的404。我只是不想要那裏的平板電腦。 –

+0

@rassie,可能有另一種解決方案:不要使用中間件,而是嘗試在你的urlpatterns結尾包含flatpages.urls。 – seler

+0

你最後的建議似乎已經完成了這個訣竅,謝謝! –

2

我認爲您的問題的解決方案很簡單:只需將Sentry404CatchMiddleware重新排列到您的MIDDLEWARES設置的頂部即可。至少,它應該在flatpage中間件之上。

爲了解釋發生了什麼,瞭解執行中間件的the order會有幫助。我猜你跟着Sentry docs並把它放在底部。這使它成爲第一個被執行的中間件。如果一個請求出現了一個不匹配的URL模式,Django會引發一個404並且Sentry中間件會記錄它。但是Django然後通過其他中間件運行,而且頁面中間件不會查找匹配頁面是否存在,而是實際替換響應。

如果您將Sentry中間件移動到頂部,那麼只有404個錯誤可以通過中間件堆棧一路走下來,這可能是您想要的。