亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

使用裝飾器添加一個變量來請求

使用裝飾器添加一個變量來請求

慕尼黑的夜晚無繁華 2023-10-26 14:30:49
我知道建議的方法是中間件,但我想實現以下內容來添加api_env在運行時訪問的變量,以便我的視圖可以訪問它:@api_wrapperdef my_view(request):    print api_env     # this is the variable I want, such as request.epi_env和裝飾者:def api_wrapper(func):    def api_inner(request):        request.api_env = 'something'        return func(request)    return api_inner最好的方法是什么?我有大約 100 個函數要包裝,所以我不想為每個函數添加新參數,但只想使用最簡單的方法來傳遞“env”變量。我該怎么辦呢。
查看完整描述

2 回答

?
慕娘9325324

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)中作為可重用組件。在這種情況下,人們通常不必考慮更復雜的邏輯,例如參數或添加到函數中的屬性,因為基于類的視圖本身會處理這些問題。


查看完整回答
反對 回復 2023-10-26
?
紅糖糍粑

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       


查看完整回答
反對 回復 2023-10-26
  • 2 回答
  • 0 關注
  • 166 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號