2014-11-14 65 views
6

如果csrf檢查失敗,Django將顯示403錯誤的頁面。Django:如何覆蓋CSRF_FAILURE_TEMPLATE

Error page displayed on csrf error

在我看來,可能發生這種錯誤經常使用,例如,當用戶在瀏覽器設置中禁用Cookie的使用。

不幸的是,這個錯誤信息對最終用戶不是很有幫助,並且有一個「django-error」佈局(這是一個問題,因爲例如站點導航丟失)。

Django有一個很好的機制來覆蓋模板,但看起來這個模板在代碼中是硬編碼的。 https://github.com/django/django/blob/1.6.8/django/views/csrf.py

有沒有辦法覆蓋這個模板,以便爲用戶提供更友好的信息?

回答

11

參考Django document,您可以在settings.py設置CSRF_FAILURE_VIEW,如:

CSRF_FAILURE_VIEW = 'your_app_name.views.csrf_failure' 

此外,您需要在您的視圖定義csrf_failure功能(需要有這樣的簽名:def csrf_failure(request, reason="")基於在文檔),這是類似的:

def csrf_failure(request, reason=""): 
    ctx = {'message': 'some custom messages'} 
    return render_to_response(your_custom_template, ctx) 

,你可以寫你的自定義模板爲:

<!DOCTYPE html> 
<html> 
    <head lang="en"> 
     <meta charset="UTF-8"> 
     <title></title> 
    </head> 
    <body> 
     {{ message }} 
    </body> 
</html> 
+0

謝謝。這正是我需要的。請注意,「原因」是一個開發者信息,不應向最終用戶顯示。所以,就我而言,我不會在我的模板中顯示它。 – luc

+0

@luc,注意到並編輯了我的答案,謝謝! – dazedconfused

+0

你會如何測試? – guival