如何在 Django 中为 "CSRF verification failed" 设置默认处理程序?

How to set a default handler for "CSRF verification failed" in django?

根据Django documentation,我们可以像这样设置默认错误处理程序:

handler403 = 'mysite.views.my_custom_permission_denied_view'
...

我的 404 和 500 处理程序工作正常。但是在禁止访问的情况下,我无法触发它(当我引发 HttpResponseForbidden 时,触发的处理程序是错误 500 的处理程序)。无论如何,那不是我的问题。我的问题是当我试图篡改(出于测试目的)CSRF 令牌时,它抛出 "Forbidden" 但同样,我的禁止访问处理程序未被调用 - 它调用 403 禁止的默认 django 模板。当我尝试访问 static(或 media)目录的根目录时,调用的页面来自服务器默认的禁止页面(在我的例子中是 apache httpd),这很好。

我的问题是:

这是我的设置:

我认为你应该阅读以下内容:

https://docs.djangoproject.com/en/1.10/ref/settings/#std:setting-CSRF_FAILURE_VIEW

(在您提供的 link 中找到)

看起来 CSRF 在 django 中的处理方式略有不同 - 它不是标准的 handler403;

你可以在设置里做

CSRF_FAILURE_VIEW = 'your_app_name.views.csrf_failure'

可见

def csrf_failure(request, reason=""):
    ctx = {'message': 'some custom messages'}
    return render(request, your_custom_template, ctx)