【问题标题】:How to catch CSRF errors in Django如何在 Django 中捕获 CSRF 错误
【发布时间】:2020-12-15 04:17:30
【问题描述】:

如何在 Django 中捕获 CSRF 错误? 例如,我想抓住这个:禁止(CSRF令牌丢失或不正确。):/asdjasdjk/asdhriheiof

我想这样做是因为我想禁止为我的特定案例篡改 CSRF 代码的人。

感谢任何帮助。

【问题讨论】:

  • 首先,CSRF 是在一个名为 CSRFViewMiddleware 的中间件中检查的,所以你需要的是,你需要用你自己的中间件覆盖中间件并捕获其中的错误。或者阅读这个中间件的文档,你会得到它的钩子

标签: python django error-handling


【解决方案1】:

我知道的一种捕获 CSRF 错误的方法是将以下设置添加到您的 settings.py:

CSRF_FAILURE_VIEW = 'app_name.views.csrf_failure'

然后在你的应用views.py上:

# This will get called when there is a csrf error.
def csrf_failure(request, reason=""):
    # Do stuff here.
    return HttpResponse(status=403)

您可以阅读有关 CSRF_FAILURE_VIEW here 的更多信息。

另一种方法是像这样覆盖 CsrfViewMiddleware 类:

from django.middleware.csrf import CsrfViewMiddleware

class CustomCsrfMiddleware(CsrfViewMiddleware):

    def process_view(self, request, callback, callback_args, callback_kwargs):
        # You can do things here before the error is raised.
        return super(CustomCsrfMiddleware, self).process_view(request, callback, callback_args, callback_kwargs)

然后在您的 settings.py 中,删除旧的 csrf 中间件并添加您的:

MIDDLEWARE = [
    'django.middleware.security.SecurityMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.common.CommonMiddleware',
    # 'django.middleware.csrf.CsrfViewMiddleware',
    'app_name.view.CustomCsrfMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
]

希望这会有所帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-08-16
    • 2019-10-07
    • 1970-01-01
    • 2011-03-12
    • 1970-01-01
    • 2019-12-02
    • 1970-01-01
    • 2011-07-01
    相关资源
    最近更新 更多