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 自定義 裝飾器

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