python django 自定义 装饰器

# -*-coding:utf-8-*-

__author__ = "GILANG ([email protected])"

"""

django 自定义用于view的装饰器

"""

from functools import wraps



def object_does_not_exist(func):

    """

    不带参数的装饰器

    """

    @wraps(func)

    def returned_wrapper(request, *args, **kwargs):

        try:

            return func(request, *args, **kwargs)

        except ObjectDoesNotExist:

            raise Http404()

    return returned_wrapper



@object_does_not_exist

def detail(request):

    """

    用法

    """

    pass



############################################################################







def object_does_not_exist(redirect=None):

    """

    第一种写法:带参数的装饰器

    """

    def decorator(func):

        @wraps(func)

        def returned_wrapper(request, *args, **kwargs):

            try:

                return func(request, *args, **kwargs)

            except ObjectDoesNotExist:

                if redirect:

                    return HttpResponseRedirect(redirect)

                else:

                    raise Http404()

        return returned_wrapper

    return decorator





@object_does_not_exist(redirect='/')

def detail(request):

    pass



# 记得加个闭合括号,否则会出现类似 takes exactly 1 argument (0 given) 的错误

@object_does_not_exist()

def foo(request):

    pass





############################################################################



def object_does_not_exist(func=None, redirect=None):

    """

    第二种写法:带参数的装饰器

    第二种方法可以解决 got an unexpected keyword argument 错误。

    """

    def decorator(func):

        @wraps(func)

        def returned_wrapper(request, *args, **kwargs):

            try:

                return func(request, *args, **kwargs)

            except ObjectDoesNotExist:

                if redirect:

                    return HttpResponseRedirect(redirect)

                else:

                    raise Http404()

        return returned_wrapper



    if not func:

        def foo(func):

            return decorator(func)

        return foo



    else:

        return decorator(func)

    

    

@object_does_not_exist(redirect='/')

def detail(request):

    pass



@object_does_not_exist

def foo(request):

    pass

  

你可能感兴趣的:(python)