2 回答

TA貢獻1783條經驗 獲得超4個贊
您可以將其推廣到使用任意數量的位置參數和命名參數。此外,您可能想要使用update_wrapper
[Python-doc]來添加類似于csrf_exempt
“輸出”視圖的屬性,否則@csrf_except
在外部函數中將不可用:
from functools import update_wrapper
def api_wrapper(func):
? ? def api_inner(request, *args, **kwargs):
? ? ? ? request.api_env = 'something'
? ? ? ? return func(request, *args, **kwargs)
? ? update_wrapper(api_inner, func, assigned=())
? ? return api_inner
話雖這么說,這在某種程度上表明,在這種情況下使用基于類的視圖可能會更好,因為這樣就可以定義一個mixin,然后將其混合在方法解析順序 (MRO)中作為可重用組件。在這種情況下,人們通常不必考慮更復雜的邏輯,例如參數或添加到函數中的屬性,因為基于類的視圖本身會處理這些問題。

TA貢獻1815條經驗 獲得超6個贊
嘗試這個:
def api_wrapper():
def decorator(view_func):
@wraps(view_func)
def _wrapped_view(req, *args, **kwargs):
req.env = 'something'
return view_func(req, *args, **kwargs)
return _wrapped_view
return decorator
添加回答
舉報