Django 視圖常需疊加多個裝飾器(如 @csrf_exempt、@require_POST),導致程式碼冗長。利用高階函式 compose 將多個裝飾器合併為一行。
多層裝飾器等價於嵌套呼叫:
@csrf_exempt
@require_POST
def foo(request): pass
# 等價於
foo = csrf_exempt(require_POST(foo))
def compose(*decorators):
def decorator(func):
for dec in reversed(decorators):
func = dec(func)
return func
return decorator
@compose(csrf_exempt, require_POST)
def foo(request):
pass
裝飾器按參數順序從右至左套用,reversed 確保執行順序與原多行寫法一致。
def compose_with_args(*decorator_factories):
def decorator(func):
for factory in reversed(decorator_factories):
func = factory()(func) # 呼叫工廠函式取得實際裝飾器
return func
return decorator
compose 模式減少視覺雜訊,提升可讀性,適合固定組合的裝飾器群組(如 API 視圖通用驗證、日誌、權限檢查)。