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?