Django не может реализовать функциональность decorator_from_middleware

Я работаю над проектом, в котором пытаюсь написать промежуточное ПО, которое при вызове будет проверять токен от стороннего сервиса и проверять роли, хранящиеся в этом токене. Я могу успешно написать и использовать промежуточное ПО, но мне нужно реализовать его только для выбранных представлений, для чего я не могу преобразовать промежуточное ПО в декоратор с помощью decorator_from_middleware, чтобы использовать его только там, где это необходимо.

Это класс промежуточного ПО (с удаленной частью проверки токенов).

class SimpleMiddleware:
    def __init__(self, get_response):
        self.get_response = get_response

    def __call__(self, request):
        # Code to be executed for each request before
        # the view (and later middleware) are called.
        print(f"inside the custom middleware")
        

        response = self.get_response(request)

        # Code to be executed for each request/response after
        # the view is called.

        return response

Вот как я пытаюсь использовать его в файле представления.

from django.utils.decorators import decorator_from_middleware
from users.middleware import SimpleMiddleware
simple_decorator = decorator_from_middleware(SimpleMiddleware)

class UserPoolInfo(APIView):
    @simple_decorator
    def get(self, request):
        user_manager_object = UserManager()
        user_pool_info = user_manager_object.get_user_pool_info()
        response_data = {
            "status":"Success",
            "statusCode": status.HTTP_200_OK,
            "message":"fetched user pool information",
            "data": user_pool_info
        }
        return Response(response_data, status.HTTP_200_OK)

мы используем Django 5.0 с Django Rest Framework.

Я пробовал следовать ответу из этого вопроса, но, похоже, он не работает. Я также попробовал документацию, в которой говорится, что пользовательское промежуточное ПО должно быть совместимо со старым стилем промежуточного ПО, но я не могу понять, как его написать, поскольку я не знаком с версиями django до 5.0.

Я думаю, что ваша проблема возникла из-за класса SimpleMiddleware, потому что вы не установили для него родительский класс, для этого вы должны импортировать : from django.utils.deprecation import MiddlewareMixin и than

class SimpleMiddleware(MiddlewareMixin):
    def __init__(self, get_response):
        self.get_response = get_response

    def __call__(self, request):
        # Code to be executed for each request before
        # the view (and later middleware) are called.
        print(f"inside the custom middleware")
        

        response = self.get_response(request)

        # Code to be executed for each request/response after
        # the view is called.

        return response

и измените свой код следующим образом. Я предлагаю вам прочитать эту статью о пользовательском промежуточном ПО: Как создать пользовательское промежуточное ПО в django?

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