Параметризованный декоратор возвращает ошибку

Я пишу декоратор для проверки определенного атрибута пользователя. Я буду использовать этот декоратор над POST или GET методами некоторых API, основанных на классах. Атрибут хранится в request.session["user_status'].

def decorator_func(func):

    def wrapper_func(class_reference, request):
        status = request.session["user_status"]
        if status != value1 or status != value2:
            return Response(data="A dictionary")
        return func(class_reference, request)

    return wrapper_func

Когда условие if не выполняется и происходит обращение к функции func, все работает как ожидалось. Но когда условие выполняется и возвращается Response(), я получаю следующую ошибку:

TypeError в "api path on which the decorator is applied"

Объект типа "пользовательская модель пользователя этого проекта" не является JSON сериализуемым

Предполагаю, что из-за неправильного написания декоратора я получаю некоторую ошибку, и когда он пытается вернуть ошибку, он также пытается вернуть текущий объект пользователя, который не является JSON сериализуемым. Объект пользователя также хранится в request.session["user"].

Что я делаю неправильно в этой параметризованной функции-декораторе?

Во-первых, у вас нет проблем в коде декоратора. Я протестировал пример, чтобы убедиться в этом. Смотрите ниже:

def decorator_for_class_method(function):
    def wrapper(self, num):
        if num % 2 == 1:
            print(f"an odd number, class_method \"{function.__name__}\" won't be called")
            return None
        return function(self, num)
    return wrapper


class MyClass:
    @decorator_for_class_method
    def only_print_even_number_for_class_method(self, num):
        print(f"num is(inside class method): {num}")

obj = MyClass()
obj.only_print_even_number_for_class_method(1)
obj.only_print_even_number_for_class_method(2)

Работает именно так, как ожидалось.

Теперь перейдем к ошибкам, которые вы получаете. В вашем коде есть две ошибки:

  1. return Response(data="A dictionary")
    . Это неправильно, Response должен принимать на вход словарь, но вы указали строку.
    . Поэтому измените его на что-то вроде Response(data={"data": "A dictionary"}), или как вы хотите, тогда он будет использоваться в рендере.

  2. Вторая проблема заключается в том, что ваш Custom User Model не является json serializable. Поскольку вы не предоставили никакого кода этого класса, я не могу сказать, как его сериализовать, или в чем проблема с тем, что вы делаете сериализацию. Вы можете посмотреть ответ(ы) здесь о том, как сериализовать конкретную модель.

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