最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Python裝飾器實現(xiàn)幾類驗證功能做法實例

 更新時間:2017年05月18日 08:28:44   投稿:jingxian  
下面小編就為大家?guī)硪黄狿ython裝飾器實現(xiàn)幾類驗證功能做法實例。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧

最近新需求來了,要給系統(tǒng)增加幾個資源權(quán)限。盡量減少代碼的改動和程序的復(fù)雜程度。所以還是使用裝飾器比較科學(xué)

之前用了一些登錄驗證的現(xiàn)成裝飾器模塊。然后仿寫一些用戶管理部分的權(quán)限裝飾器。

比如下面這種

def permission_required(permission):
  def decorator(f):
    @wraps(f)
    def decorated_function(*args, **kwargs):
      if not current_user.can(permission):
        abort(403)
      return f(*args, **kwargs)
    return decorated_function
  return decorator

def admin_required(f):
  return permission_required(Permission.SMY)(f)

調(diào)用權(quán)限的時候很好理解。直接仿寫admin_required的格式就好了。然后每個頁面入口用語法糖這樣寫: @admin_required

于是頁面的入口權(quán)限就做好了。但是資源權(quán)限和頁面權(quán)限不同。上面內(nèi)容中提到的permission是寫在model.py的靜態(tài)內(nèi)容里面的。

從封裝來看,至少是看不出來哪個地方暴露了用戶查詢的方法(菜鳥水平下)。只能簡單的看出來if判斷的時候似乎使用了current_user這個變量的內(nèi)置方法

但是current_user其實是一個第三方的包的內(nèi)容,和登錄模塊引入的包相同,是一整套記錄token信息的代碼。詳細內(nèi)容太多。從這個地方出發(fā)去寫,會go die

因為哪怕我知道其實調(diào)用的.can(permission)是model類里面定義的類方法??墒莄urrent_user是取了哪個部分的東西還是不清楚。

所以不管它。從頭來梳理一下裝飾器的內(nèi)容。

首先一個簡單的裝飾器寫法是很好理解的。比如原函數(shù)是這樣寫的:

def page():
  if user == 'admin':
    form = Form()
    
    if request.method=='POST':
      
      db.session.add(form)
      db.session.commit()
      flash("success")
      return 0

這當(dāng)然是隨便寫的一個函數(shù)(明顯有很多問題),只是用來表達一個過程。首先通過路由調(diào)用這個函數(shù)的時候,會先執(zhí)行第一個if判斷。這個判斷即我們想要的驗證內(nèi)容

驗證通過以后,說明用戶可以訪問這個頁面,然后頁面內(nèi)容會渲染出來,交互功能也被允許……

那么裝飾器,就是把這個if的功能提取出來了。那么原函數(shù)寫成這樣的形式:

@admin_check
def page():
    form = Form()

    if request.method=='POST':

      db.session.add(form)
      db.session.commit()
      flash("success")
      return 0

單從這個函數(shù)來說,這樣寫并沒有任何好處,似乎本來一行代碼搞定的問題,多用了幾行代碼。我們展開這個形式的完整代碼看一下:

def admincheck(func):
  if user=='admin':
    return func
  
def page():
    form = Form()

    if request.method=='POST':

      db.session.add(form)
      db.session.commit()
      flash("success")
      return 0

page = admincheck(page())

上面的裝飾器只是把page=admincheck這一句寫成了@模式。

但是這種寫法只能解決最基本的驗證問題。也就是相對獨立的入口驗證。這個驗證還沒有拿到程序傳遞到page()函數(shù)當(dāng)中的參數(shù)。也就是說,這個驗證這么看起來沒什么用處

不過機制是這樣。接下來就可以研究怎樣的做法是把路由傳遞過來的請求數(shù)據(jù)進行驗證然后繼續(xù)執(zhí)行的了。

def admincheck(func):
  def inner(arg):
    if user == 'admin':
      if arg == 'false':
        abort(403)
    return func(arg)
  return inner

同樣的,多個參數(shù)的時候,只需要把 def inner(arg)改寫成def inner(arg1,arg2)

n個參數(shù)的時候,則寫成def inner(*args,**kwargs) 這個需要注意一下。*args是元組,即('user',1);**kwargs是字典,即{'user':1}

同時寫這兩個形參的話,基本上就能處理所有傳遞進來的參數(shù)類型了。

當(dāng)然。除此以外還有更復(fù)雜的裝飾器寫法。不過能處理傳遞過來的參數(shù)并且不影響被裝飾函數(shù)的正常執(zhí)行?;旧蠈崿F(xiàn)了之前的功能。

那么回過頭來看示例當(dāng)中的寫法。最外層使用def permission_required(permission): 的意義,顯然是想要實現(xiàn)復(fù)用。

def admin_required(f):
  return permission_required(Permission.SMY)(f)

上面的(permission)形參顯然對應(yīng)permission_required(Permission.SMY)中(Permission.SMY)這個參數(shù)。把這個參數(shù)的形參傳遞到方法體內(nèi)部

這也是為什么要在裝飾器decorator(f)外面再嵌套一層函數(shù)的原因——實現(xiàn)復(fù)用

于是之前這個寫法的內(nèi)容就很清晰了

def permission_required(permission):

#通過形參實現(xiàn)了一個裝飾器類。對于不同針對性的裝飾器,都可以調(diào)用這個函數(shù)的實現(xiàn),而只需要做最小的改動(傳遞形參)
  def decorator(f):
  #這個才是裝飾器開始執(zhí)行的第一步
    @wraps(f)
    #這個裝飾器實際上是為了保證函數(shù)的原始屬性不發(fā)生改變。所謂原始屬性,指的是__name__ 這種屬性
    def decorated_function(*args, **kwargs):
    #這個裝飾器方法把原函數(shù)的形參繼承了。因此實際上相當(dāng)于在原函數(shù)開頭增加了這個函數(shù)的內(nèi)容
      if not current_user.can(permission):
      #這個地方很明顯。current_user是從內(nèi)存中?。ǚ?wù)端),然后permission就會根據(jù)我們實際需要驗證的permission進行形參到實參的轉(zhuǎn)化
        abort(403)
        #明顯的異常處理,當(dāng)然,403是一個粗暴的方法。更粗暴的方法,我會用redirect(url_for(logout))...
      return f(*args, **kwargs)
      #結(jié)束判斷,把參數(shù)傳遞給原函數(shù)(此處的f()即是原函數(shù)(更具體的權(quán)限驗證裝飾器),只是f是個丑陋的形參而已)
    return decorated_function
  return decorator

這樣差不多就結(jié)束了。如果有人想補充,歡迎留言。

以上這篇Python裝飾器實現(xiàn)幾類驗證功能做法實例就是小編分享給大家的全部內(nèi)容了,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • 基于Python繪制鍵盤按鍵使用次數(shù)的熱力圖

    基于Python繪制鍵盤按鍵使用次數(shù)的熱力圖

    這篇文章主要為大家詳細介紹了如何使用Python繪制鍵盤按鍵使用次數(shù)的熱力圖,文中的示例代碼講解詳細,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2024-04-04
  • Python基于QQ郵箱實現(xiàn)SSL發(fā)送

    Python基于QQ郵箱實現(xiàn)SSL發(fā)送

    這篇文章主要介紹了Python基于QQ郵箱實現(xiàn)SSL發(fā)送,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-04-04
  • 詳解python數(shù)據(jù)結(jié)構(gòu)和算法

    詳解python數(shù)據(jù)結(jié)構(gòu)和算法

    這篇文章主要介紹了python數(shù)據(jù)結(jié)構(gòu)和算法,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-04-04
  • 詳解Python爬蟲的基本寫法

    詳解Python爬蟲的基本寫法

    這篇文章主要介紹了詳解Python爬蟲的基本寫法 的相關(guān)資料,需要的朋友可以參考下
    2016-01-01
  • Python檢驗用戶輸入密碼的復(fù)雜度

    Python檢驗用戶輸入密碼的復(fù)雜度

    這篇文章主要介紹了Python檢驗用戶輸入密碼的復(fù)雜度,在用戶設(shè)置密碼的時候檢測輸入的密碼大小寫數(shù)字等,需要的朋友可以參考下
    2023-04-04
  • Python中的pygal安裝和繪制直方圖代碼分享

    Python中的pygal安裝和繪制直方圖代碼分享

    這篇文章主要介紹了Python中的pygal安裝和繪制直方圖代碼分享,具有一定借鑒價值,需要的朋友可以參考下。
    2017-12-12
  • Python圖片處理之圖片裁剪教程

    Python圖片處理之圖片裁剪教程

    這篇博文的目的是從圖片中提取一定的矩形區(qū)域作為新的圖片 簡單來說:我的全家福丟了,所以我想從以前的房間照片里,提取出其中的全家福并重新打印一張(忽視畫質(zhì)問題)現(xiàn)在我就是這么個目的,需要的朋友可以參考下
    2021-05-05
  • python語法教程之def()函數(shù)定義及用法

    python語法教程之def()函數(shù)定義及用法

    函數(shù)是組織好的,可重復(fù)使用的,用來實現(xiàn)單一,或相關(guān)聯(lián)功能的代碼段,下面這篇文章主要給大家介紹了關(guān)于python語法教程之def()函數(shù)定義及用法的相關(guān)資料,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下
    2023-01-01
  • 基于Python實現(xiàn)千圖成像工具的示例代碼

    基于Python實現(xiàn)千圖成像工具的示例代碼

    千圖成像也就是用N張圖片組成一張圖片的效果。這篇文章將利用Python語言編寫一個簡單的千圖成像工具,感興趣的小伙伴可以了解一下
    2022-07-07
  • AMP?Tensor?Cores節(jié)省內(nèi)存PyTorch模型詳解

    AMP?Tensor?Cores節(jié)省內(nèi)存PyTorch模型詳解

    這篇文章主要為大家介紹了AMP?Tensor?Cores節(jié)省內(nèi)存PyTorch模型詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-10-10

最新評論

紫阳县| 大方县| 广河县| 襄垣县| 塘沽区| 马关县| 若尔盖县| 九江市| 三都| 大宁县| 共和县| 连云港市| 湟中县| 凌源市| 义马市| 舟曲县| 黎城县| 海兴县| 松潘县| 康马县| 湾仔区| 莱州市| 安乡县| 新巴尔虎左旗| 武汉市| 巴青县| 盐津县| 祥云县| 陆丰市| 石泉县| 宜宾市| 剑川县| 老河口市| 鹿泉市| 富民县| 颍上县| 竹山县| 克拉玛依市| 六枝特区| 得荣县| 枣强县|