Python Django:如何覆盖CSRF_FAILURE_模板

Python Django:如何覆盖CSRF_FAILURE_模板,python,django,django-templates,django-csrf,Python,Django,Django Templates,Django Csrf,如果csrf检查失败,Django将显示一个带有403错误的页面 在我看来,这种错误可能发生在常规使用中,例如,当用户在其浏览器设置中禁用cookie使用时 不幸的是,此错误消息对最终用户帮助不大,并且具有“django错误”布局(这是一个问题,因为例如缺少站点导航) Django有一个很好的覆盖模板的机制,但是这个模板似乎是在代码中硬编码的 是否有方法覆盖此模板以向用户提供更友好的消息?请参阅,您可以在设置.py中设置CSRF\u FAILURE\u视图,例如: CSRF_FAILURE_V

如果csrf检查失败,Django将显示一个带有403错误的页面

在我看来,这种错误可能发生在常规使用中,例如,当用户在其浏览器设置中禁用cookie使用时

不幸的是,此错误消息对最终用户帮助不大,并且具有“django错误”布局(这是一个问题,因为例如缺少站点导航)

Django有一个很好的覆盖模板的机制,但是这个模板似乎是在代码中硬编码的

是否有方法覆盖此模板以向用户提供更友好的消息?

请参阅,您可以在
设置.py
中设置
CSRF\u FAILURE\u视图
,例如:

CSRF_FAILURE_VIEW = 'your_app_name.views.csrf_failure'
此外,您还需要在视图中定义一个
csrf\u failure
函数(需要有此签名:
def csrf\u 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>

{{message}}

从Django 1.10开始,您可以简单地将
403_csrf.html
模板添加和自定义:

403_csrf.html模板添加到项目模板目录中

正如您在源代码django/views/csrf.py中所看到的:如果您有这个模板,它将被应用。不需要配置任何内容

您需要根据需要自定义的模板内容:

<div id="summary">
  <h1>{{ title }} <span>(403)</span></h1>
  <p>{{ main }}</p>
{% if no_referer %}
  <p>{{ no_referer1 }}</p>
  <p>{{ no_referer2 }}</p>
  <p>{{ no_referer3 }}</p>
{% endif %}
{% if no_cookie %}
  <p>{{ no_cookie1 }}</p>
  <p>{{ no_cookie2 }}</p>
{% endif %}
</div>

{{title}}(403)
{{main}}

{%如果没有\u referer%} {{no_referer1}}

{{no_referer2}}

{{no_referer3}}

{%endif%} {%如果没有_cookie%} {{no_cookie1}}

{{no_cookie2}}

{%endif%}
谢谢。这正是我所需要的。只需注意,“原因”是开发人员的消息,不应向最终用户显示。因此,在我的情况下,我不会在我的模板中显示它。你将如何测试它?@guival:转到包含表单的页面,打开开发工具(Chrome上的ctrl+maj+I),找到csrf输入字段,编辑其值,发送表单@杰布,太棒了,谢谢!我最后做的是设置一个url以在调试中呈现该模板,这只允许我查看csrf失败模板,但不能确保它按预期工作。@guival在两个选项卡中打开应用程序登录页。在一个选项卡中登录应用程序,然后尝试在另一个选项卡上登录。您应该看到CSRF错误。