Django 4.0.2 | Python 3.9.7 | TypeError: __init__() missing 1 required positional argument: 'get_response'

Django 4.0.2 | Python 3.9.7 | TypeError: __init__() missing 1 required positional argument: 'get_response'

我写了一个自定义的认证,在认证过程中添加了一个csrf校验中间件。 我在身份验证函数中调用以下函数。

def enforce_csrf(self, request):
    """
    Enforce CSRF validation
    """
    check = CSRFCheck()
    check.process_request(request)
    reason = check.process_view(request, None, (), {})
    if reason:
        # CSRF failed, bail with explicit error message
        raise PermissionDenied('CSRF Failed: %s' % reason)

CSRFCheck() 函数是一个自定义中间件,它看起来像这样。

class CSRFCheck(CsrfViewMiddleware):
    def _reject(self, request, reason):
        return reason

现在,当我尝试处理需要身份验证的请求时,出现错误:
TypeError:init() 缺少 1 个必需的位置参数:'get_response'

相同的代码在 Django 3.2 中完美运行

现在,就我能够调试而言,CSRFCheck 函数需要一个 get_response 方法,但我不知道它来自哪里。

创建自定义中间件的 API 似乎是您在初始化时提供 get_response 参数。

https://docs.djangoproject.com/en/4.0/topics/http/middleware/#writing-your-own-middleware

当您调用 CSRFCheck() 时,您没有向它提供该参数,因此当它运行时,它会失败。

您可以尝试按照上面 link 中的示例并重新格式化您的自定义中间件以匹配他们提供的示例。

将 Django 版本降级到 3.2.X 直到 bug 修复。