【问题标题】:Django : How to override the CSRF_FAILURE_TEMPLATEDjango:如何覆盖 CSRF_FAILURE_TEMPLATE
【发布时间】:2014-11-14 07:45:58
【问题描述】:

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

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

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

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

有没有办法覆盖这个模板以便向用户提供更友好的信息?

【问题讨论】:

    标签: python django django-templates django-csrf


    【解决方案1】:

    参考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>
    

    【讨论】:

    • 谢谢。这正是我所需要的。请注意,“原因”是开发人员消息,不应向最终用户显示。所以,就我而言,我不会在我的模板中显示它。
    • 你将如何测试这个?
    • @guival : 进入一个有表单的页面,打开开发者工具(在 Chrome 上是 ctrl+maj+i),找到 csrf 输入框,编辑它的值,发送表单!
    • @Jeb 很棒的技巧,谢谢!我最后做的是设置一个 url 以在调试中呈现该模板,这只是让我看到 csrf 失败模板,但不能确保它按预期工作。
    • @guival 在两个选项卡中打开您的应用程序登录页面。在一个选项卡中登录应用程序,然后尝试在另一个选项卡上登录。您应该会看到 CSRF 错误。
    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      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>
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-11-08
        • 2015-02-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-03-01
        • 2011-01-10
        • 1970-01-01
        相关资源
        最近更新 更多