2014-11-14 29 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