Django 4.0.2 | Python 3.9.7 | TypeError: __init__() отсутствует 1 необходимый позиционный аргумент: '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() missing 1 required positional argument: 'get_response'

тот же код прекрасно работает в Django 3.2

Теперь, насколько я смог отладить, функция CSRFCheck ожидает метод get_response, который я не знаю, откуда берется. get_response argument error

Похоже, что API для создания пользовательского промежуточного ПО заключается в том, что вы предоставляете параметр get_response при инициализации.

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

Когда вы вызываете CSRFCheck(), вы не предоставляете ему этот параметр, поэтому, когда он запускается, он терпит неудачу.

Вы можете попробовать следовать примеру, приведенному в ссылке выше, и переформатировать ваше пользовательское промежуточное ПО в соответствии с приведенным примером.

Понизьте версию Django до 3.2.X, пока ошибка не будет исправлена.

Вернуться на верх