標籤:
# -*-coding:utf-8-*-__author__ = "GILANG ([email protected])""""django 自訂用於view的裝飾器"""from functools import wrapsdef 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_existdef 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_existdef foo(request): pass
python django 自訂 裝飾器