Декораторы функций с параметрами на основе класса в Django

Официальная документация объясняет, как украсить представление на основе класса, однако я не мог найти никакой информации о том, как предоставить параметры декоратору.

Я хотел бы достичь чего-то вроде

class MyView(View):
    @method_decorator(mydecorator, some_parameters)
    def dispatch(self, *args, **kwargs):
        return super(MyView, self).dispatch(*args, **kwargs)

который должен быть эквивалентен

@mydecorator(some_parameters)
def my_view(request):
    ....

Как я могу справиться с такими случаями?

Ответ 1

@method_decorator принимает функцию как параметр. Если вы хотите передать декоратор с параметрами, вам нужно только:

  • Оцените параметры в функции создателя-декоратора.
  • Передайте оцениваемое значение @method_decorator.

В явном коде Python это будет:

decorator = mydecorator(arg1, arg2, arg...)
method_dec = method_decorator(decorator)

class MyClass(View):
    @method_dec
    def my_view(request):
        ...

Итак, полностью используя синтаксический сахар:

class MyClass(View):
    @method_decorator(mydecorator(arg1, arg2, arg...))
    def my_view(request):
        ...