Создание универсального декоратора вида с дополнительным параметром - PullRequest
0 голосов
/ 22 мая 2018

При попытке создать декоратор, чтобы обернуть представления моего приложения, я не смог передать аргумент своему декоратору.мои представления в настоящее время выглядят так:

@api_view(['GET', 'POST'])
@permission_classes((IsAuthenticated,))
def some_view(request):

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

@api_view(['GET', 'POST'])
@permission_classes((IsAuthenticated,))
@generic_view("some argument")
def some_view(request):

с этим generic_view:

def generic_view(argument):
    def _method_wrapper(func):
        def decorator(request, *args, **kwargs):
            some_function(argument)
            data = func(request)
            return Response(data, status=200)
        return decorator
    return _method_wrapper

Проблема в том, что аргумент не передан.Я искал это и аргумент, арги и карги, и это просто не прошло.Кстати, я использую django 1.8, python 2.7.

1 Ответ

0 голосов
/ 22 мая 2018

Этого можно добиться с помощью функции lambda

decorator_with_arguments = lambda decorator: lambda *args, **kwargs:lambda func: decorator(func, *args, **kwargs) 

Теперь ваша обертка ваша функция с этим декоратором.Будет работать следующее:

@decorator_with_arguments
def generic_view(function,arg):
    def _method(request, *args, **kwargs):
        print(arg) # print arg : Python 2.*
        # data = func(request)
        return function(request, *args, **kwargs)
    return _method

Теперь вы можете использовать generic_view в качестве @ decorator в вашем views

@generic_view("some argument")
def some_view(request):
    pass

# output
>>> 'some argument'
...