Django:如何覆盖CSRF_FAILURE_TEMPLATE

luc*_*luc 14 python django django-templates django-csrf

如果csrf检查失败,Django会显示一个403错误的页面.

csrf错误显示错误页面

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

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

Django有一个很好的机制来覆盖模板,但似乎这个模板在代码中是硬编码的.https://github.com/django/django/blob/1.6.8/django/views/csrf.py

有没有办法覆盖此模板,以便向用户提供更友好的消息?

daz*_*sed 23

请参阅Django文档,您可以CSRF_FAILURE_VIEW在您的设置中settings.py,例如:

CSRF_FAILURE_VIEW = 'your_app_name.views.csrf_failure'
Run Code Online (Sandbox Code Playgroud)

此外,您需要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)
Run Code Online (Sandbox Code Playgroud)

您可以将自定义模板编写为:

<!DOCTYPE html>
<html>
    <head lang="en">
        <meta charset="UTF-8">
        <title></title>
    </head>
    <body>
        {{ message }}
    </body>
</html>
Run Code Online (Sandbox Code Playgroud)

  • @guival:转到带有表单的页面,打开开发人员工具(Chrome上的ctrl + maj + i),找到csrf输入字段,编辑其值,发送表单! (4认同)

小智 5

从Django 1.10开始,您可以简单地添加和自定义403_csrf.html模板:https : //docs.djangoproject.com/en/1.10/ref/settings/#std : setting-CSRF_FAILURE_VIEW