使用额外参数创建通用视图装饰器

时间:2018-05-22 12:46:08

标签: django python-2.7 django-views python-decorators

在尝试创建装饰器来包装我的应用程序视图时,我无法将参数传递给我的装饰器。 我的观点目前看起来像这样:

@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

问题是参数没有通过。我寻找它和争论,args和kwargs并且它刚刚没有通过。 顺便说一句,我正在使用django 1.8,python 2.7。

1 个答案:

答案 0 :(得分:0)

这可以通过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

中使用views作为 @decorator
@generic_view("some argument")
def some_view(request):
    pass

# output
>>> 'some argument'