Параметризованный декоратор возвращает ошибку
Я пишу декоратор для проверки определенного атрибута пользователя. Я буду использовать этот декоратор над 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)
Работает именно так, как ожидалось.
Теперь перейдем к ошибкам, которые вы получаете. В вашем коде есть две ошибки:
return
Response(data="A dictionary")
. Это неправильно, Response должен принимать на вход словарь, но вы указали строку.
. Поэтому измените его на что-то вродеResponse(data={"data": "A dictionary"})
, или как вы хотите, тогда он будет использоваться в рендере.Вторая проблема заключается в том, что ваш
Custom User Model
не является json serializable. Поскольку вы не предоставили никакого кода этого класса, я не могу сказать, как его сериализовать, или в чем проблема с тем, что вы делаете сериализацию. Вы можете посмотреть ответ(ы) здесь о том, как сериализовать конкретную модель.