如何在 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),这很好。
我的问题是:
- 如何为 "CSRF verification failed" 设置默认处理程序?
- 调用 403 处理程序的情况是什么?
- 如何触发 403 禁止错误?
这是我的设置:
- Python3.4
- Django 1.10(生产、调试 = False)
- 服务器:Apache httpd 通过 mod_wsgi
- Windows 7 32位
我认为你应该阅读以下内容:
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)
根据Django documentation,我们可以像这样设置默认错误处理程序:
handler403 = 'mysite.views.my_custom_permission_denied_view'
...
我的 404 和 500 处理程序工作正常。但是在禁止访问的情况下,我无法触发它(当我引发 HttpResponseForbidden
时,触发的处理程序是错误 500 的处理程序)。无论如何,那不是我的问题。我的问题是当我试图篡改(出于测试目的)CSRF
令牌时,它抛出 "Forbidden" 但同样,我的禁止访问处理程序未被调用 - 它调用 403 禁止的默认 django 模板。当我尝试访问 static
(或 media
)目录的根目录时,调用的页面来自服务器默认的禁止页面(在我的例子中是 apache httpd),这很好。
我的问题是:
- 如何为 "CSRF verification failed" 设置默认处理程序?
- 调用 403 处理程序的情况是什么?
- 如何触发 403 禁止错误?
这是我的设置:
- Python3.4
- Django 1.10(生产、调试 = False)
- 服务器:Apache httpd 通过 mod_wsgi
- Windows 7 32位
我认为你应该阅读以下内容:
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)