Django自定义用于Views的装饰器

Django自定义用于Views的装饰器


不带参数的装饰器

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):  
    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 django 自定义 装饰器

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章