В __init__() отсутствует 1 необходимый позиционный аргумент: ошибка 'get_response' на решении Django HttpOnly JWT

В настоящее время у меня есть установка Django, которая следует руководству, приведенному ниже. В основном, это обходной путь, который позволяет использовать HTTPOnly cookies для аутентификации Django Rest Framework JWT. Это прекрасно работало в Django 3.2, но я пытаюсь перейти на Django 4, и теперь я сталкиваюсь с ошибкой ниже

Как хранить JWT-токены в HttpOnly cookies с помощью пакета DRF djangorestframework-simplejwt?

Ошибка:

__init__() missing 1 required positional argument: 'get_response'

Я все еще немного новичок в Django и DRF, поэтому я понятия не имею, что может происходить.

Редактирование:

Прошу прощения, забыл добавить некоторые детали. Ошибка находится в следующем коде, на CSRFCheck():

def enforce_csrf(request):
# Enforce CSRF validation.
check = CSRFCheck()
check.process_request(request)
# populates request.META['CSRF_COOKIE'], which is used in process_view()
reason = check.process_view(request, None, (), {})

if reason:
    # CSRF failed, bail with explicit error message
    raise exceptions.PermissionDenied('CSRF Failed: %s' % reason)

Сообщения об ошибках:

/usr/local/lib/python3.8/site-packages/django/core/handlers/exception.py, строка 55, in inner

        return inner

    else:

        @wraps(get_response)

        def inner(request):

            try:

                response = get_response(request)

 …

            except Exception as exc:

                response = response_for_exception(request, exc)

            return response

        return inner

Локальные переменные /usr/local/lib/python3.8/site-packages/django/core/handlers/base.py, строка 197, in _get_response

        if response is None:

            wrapped_callback = self.make_view_atomic(callback)

            # If it is an asynchronous view, run it in a subthread.

            if asyncio.iscoroutinefunction(wrapped_callback):

                wrapped_callback = async_to_sync(wrapped_callback)

            try:

                response = wrapped_callback(request, *callback_args, **callback_kwargs)

 …

            except Exception as e:

                response = self.process_exception_by_middleware(e, request)

                if response is None:

                    raise

        # Complain if the view returned None (a common error).

Локальные переменные /usr/local/lib/python3.8/site-packages/django/views/decorators/csrf.py, строка 54, in wrapped_view

def csrf_exempt(view_func):

    """Mark a view function as being exempt from the CSRF view protection."""

    # view_func.csrf_exempt = True would also work, but decorators are nicer

    # if they don't have side effects, so return a new function.

    def wrapped_view(*args, **kwargs):

        return view_func(*args, **kwargs)

 …

    wrapped_view.csrf_exempt = True

    return wraps(view_func)(wrapped_view)

Локальные переменные /usr/local/lib/python3.8/site-packages/django/views/generic/base.py, строка 84, in view

            self = cls(**initkwargs)

            self.setup(request, *args, **kwargs)

            if not hasattr(self, "request"):

                raise AttributeError(

                    "%s instance has no 'request' attribute. Did you override "

                    "setup() and forget to call super()?" % cls.__name__

                )

            return self.dispatch(request, *args, **kwargs)

 …

        view.view_class = cls

        view.view_initkwargs = initkwargs

        # __name__ and __qualname__ are intentionally left unchanged as

        # view_class should be used to robustly determine the name of the view

Локальные переменные /usr/local/lib/python3.8/site-packages/rest_framework/views.py, строка 509, in dispatch

                                  self.http_method_not_allowed)

            else:

                handler = self.http_method_not_allowed

            response = handler(request, *args, **kwargs)

        except Exception as exc:

            response = self.handle_exception(exc)

 …

        self.response = self.finalize_response(request, response, *args, **kwargs)

        return self.response

    def options(self, request, *args, **kwargs):

        """

Локальные переменные /usr/local/lib/python3.8/site-packages/rest_framework/views.py, строка 469, in handle_exception

        exception_handler = self.get_exception_handler()

        context = self.get_exception_handler_context()

        response = exception_handler(exc, context)

        if response is None:

            self.raise_uncaught_exception(exc)

 …

        response.exception = True

        return response

    def raise_uncaught_exception(self, exc):

        if settings.DEBUG:

Локальные переменные /usr/local/lib/python3.8/site-packages/rest_framework/views.py, строка 480, in raise_uncaught_exception

    def raise_uncaught_exception(self, exc):

        if settings.DEBUG:

            request = self.request

            renderer_format = getattr(request.accepted_renderer, 'format')

            use_plaintext_traceback = renderer_format not in ('html', 'api', 'admin')

            request.force_plaintext_errors(use_plaintext_traceback)

        raise exc

 …

    # Note: Views are made CSRF exempt from within `as_view` as to prevent

    # accidental removal of this exemption in cases where `dispatch` needs to

    # be overridden.

    def dispatch(self, request, *args, **kwargs):

        """

Локальные переменные /usr/local/lib/python3.8/site-packages/rest_framework/views.py, строка 497, in dispatch

        self.args = args

        self.kwargs = kwargs

        request = self.initialize_request(request, *args, **kwargs)

        self.request = request

        self.headers = self.default_response_headers  # deprecate?

        try:

            self.initial(request, *args, **kwargs)

 …

            # Get the appropriate handler method

            if request.method.lower() in self.http_method_names:

                handler = getattr(self, request.method.lower(),

                                  self.http_method_not_allowed)

            else:

Локальные переменные /usr/local/lib/python3.8/site-packages/rest_framework/views.py, строка 414, in initial

        request.accepted_renderer, request.accepted_media_type = neg

        # Determine the API version, if versioning is in use.

        version, scheme = self.determine_version(request, *args, **kwargs)

        request.version, request.versioning_scheme = version, scheme

        # Ensure that the incoming request is permitted

        self.perform_authentication(request)

 …

        self.check_permissions(request)

        self.check_throttles(request)

    def finalize_response(self, request, response, *args, **kwargs):

        """

        Returns the final response object.

Локальные переменные /usr/local/lib/python3.8/site-packages/rest_framework/views.py, строка 324, in perform_authentication

        """

        Perform authentication on the incoming request.

        Note that if you override this and simply 'pass', then authentication

        will instead be performed lazily, the first time either

        `request.user` or `request.auth` is accessed.

        """

        request.user

 …

    def check_permissions(self, request):

        """

        Check if the request should be permitted.

        Raises an appropriate exception if the request is not permitted.

        """

Локальные переменные /usr/local/lib/python3.8/site-packages/rest_framework/request.py, строка 227, in user

    def user(self):

        """

        Returns the user associated with the current request, as authenticated

        by the authentication classes provided to the request.

        """

        if not hasattr(self, '_user'):

            with wrap_attributeerrors():

                self._authenticate()

 …

        return self._user

    @user.setter

    def user(self, value):

        """

        Sets the user on the current request. This is necessary to maintain

Локальные переменные /usr/local/lib/python3.8/site-packages/rest_framework/request.py, строка 380, in _authenticate

    def _authenticate(self):

        """

        Attempt to authenticate the request using each authentication instance

        in turn.

        """

        for authenticator in self.authenticators:

            try:

                user_auth_tuple = authenticator.authenticate(self)

 …

            except exceptions.APIException:

                self._not_authenticated()

                raise

            if user_auth_tuple is not None:

                self._authenticator = authenticator

Локальные переменные /django/users/authenticate.py, строка 30, in authenticate

        if header is None:

            raw_token = request.COOKIES.get(settings.SIMPLE_JWT['AUTH_COOKIE']) or None

        else:

            raw_token = self.get_raw_token(header)

        if raw_token is None:

            return None

        validated_token = self.get_validated_token(raw_token)

        enforce_csrf(request)

 …

        return self.get_user(validated_token), validated_token

Локальные переменные /django/users/authenticate.py, строка 10, in enforce_csrf

from rest_framework.authentication import CSRFCheck

from rest_framework import exceptions

def enforce_csrf(request):

    # Enforce CSRF validation.

    check = CSRFCheck()

 …

    check.process_request(request)

    # populates request.META['CSRF_COOKIE'], which is used in process_view()

    reason = check.process_view(request, None, (), {})

    if reason:

        # CSRF failed, bail with explicit error message

Приведенная ниже ссылка на стек может помочь вам

MiddlewareMixin missing required argument: 'get_response' django

https://github.com/encode/django-rest-framework/commit/7921e9af434f2ccfde6962cf8a1b76331cc77722#diff-25717930a68aebbdb51ee5f4060fb1e756d65ee4e8d96faf8ad614ceced0db05

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