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