国产成人精品久久免费动漫-国产成人精品天堂-国产成人精品区在线观看-国产成人精品日本-a级毛片无码免费真人-a级毛片毛片免费观看久潮喷

您的位置:首頁(yè)技術(shù)文章
文章詳情頁(yè)

python - flask 用戶權(quán)限修飾器

瀏覽:73日期:2022-07-19 11:35:36

問(wèn)題描述

看書(shū)發(fā)現(xiàn)這段代碼有點(diǎn)云里霧里,裝飾器有點(diǎn)昏,希望幫我解析下這段代碼!!

from functools import wrapsfrom flask import abortfrom flask_login import current_userfrom .models import Permissiondef 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 decoratordef admin_required(f): return permission_required(Permission.ADMINISTER)(f)

問(wèn)題解答

回答1:

首先你要理解裝飾器的原理:

@abcddef f(): pass

實(shí)際上與下面的語(yǔ)句等價(jià):

def f(): passf=abcd(f)

我們現(xiàn)在有一個(gè)函數(shù)abcd,這個(gè)函數(shù)的本質(zhì)是:接受另一個(gè)函數(shù)當(dāng)做參數(shù),且返回一個(gè)函數(shù)。(至于返回的函數(shù)用來(lái)干嘛那就是你的事了)。這時(shí)候,abcd僅僅就是個(gè)函數(shù)而已,還不是修飾器。而由于以下這個(gè)需求十分的常見(jiàn):有一個(gè)舊函數(shù),我們又想定義一個(gè)新函數(shù),這個(gè)新函數(shù)大體上功能與舊函數(shù)接近,只是多了一點(diǎn)點(diǎn)的新功能,比如打印個(gè)日期,判斷個(gè)權(quán)限什么的。那么定義新函數(shù)的過(guò)程中肯定會(huì)調(diào)用這個(gè)舊函數(shù),然而新函數(shù)其實(shí)改變不大,舊函數(shù)往往也沒(méi)用了(因?yàn)橐话阄覀兒竺娑际怯玫男潞瘮?shù)了),那么為了不讓命名空間變得混亂和方便開(kāi)發(fā),我們可以簡(jiǎn)單的就用舊函數(shù)的名字來(lái)表示新函數(shù),也就是在定義完了一個(gè)新函數(shù)之后,我們把它的名字又變回以前的f,而以前的f就不要了。所以我們可以這樣做:定義一個(gè)函數(shù)abcd,它接受一個(gè)函數(shù)f,且返回一個(gè)新的函數(shù),再把它的返回值(新函數(shù)),再賦值給f(python里函數(shù)名也可以賦值,成為另一個(gè)函數(shù))。這實(shí)際上就是我上面的第二段代碼做的事情。由于這個(gè)需求太過(guò)常見(jiàn),所以python專門(mén)為它定義了語(yǔ)法。你不是每次都要f=abcd(f)嗎,那你就直接在f的def語(yǔ)句前面加個(gè)@abcd得了,也別每次再寫(xiě)后面那句了,不僅麻煩,有時(shí)還容易誤解。這時(shí)候,abcd就成為了裝飾器。了解了這個(gè)等價(jià)關(guān)系,你的函數(shù)就好理解了:當(dāng)你在某處使用的時(shí)候,是這樣的

@permission_required(permission)def old(): pass

等價(jià)于

def old(): passold = permission_required(permission)(old)

優(yōu)先級(jí)相同,運(yùn)算從左到右,首先計(jì)算permission_required(permission),它返回decorator是一個(gè)函數(shù),這時(shí)候變成old = decorator(old)為了滿足成為修飾器的要求,這個(gè)decorator應(yīng)當(dāng)返回一個(gè)新函數(shù)才行,在這里就是decorated_function,所以原賦值語(yǔ)句變成old = decorated_function。到這里比較清晰了,把一個(gè)函數(shù)的名字賦值給一個(gè)變量(old),所以old就變成了decorated_function這里所定義的函數(shù)。過(guò)程也就是:

old = permission_required(permission)(old)-> old = decorator(old)-> old = decorated_function回答2:

希望下面代碼對(duì)你有幫助

from functools import wrapsdef permission_required(permission): '''返回裝飾器,裝飾器中使用入?yún)?permission ''' def decorator(f):@wraps(f)def decorated_function(*args, **kwargs): if not permission:print ’403’return return f(*args, **kwargs)return decorated_function return decoratordef admin_required_true(f): '''裝飾器函數(shù),返回裝飾器 ''' return permission_required(True)(f)def admin_required_false(f): '''裝飾器函數(shù),返回裝飾器 ''' return permission_required(False)(f)@admin_required_truedef foo(): '''使用裝飾器 ''' print ’foo’ @admin_required_falsedef bar(): '''使用裝飾器 ''' print ’bar’foo()bar()

運(yùn)行結(jié)果:

foo403

標(biāo)簽: Python 編程
相關(guān)文章:
主站蜘蛛池模板: 亚洲综合色就色手机在线观看 | 真实国产乱人伦在线视频播放 | 中文字幕一区二区三区视频在线 | 久久精品中文字幕不卡一二区 | 亚洲成人tv | 女在床上被男的插爽叫视频 | 国产看片一区二区三区 | 久久99精品这里精品3 | 精品欧美一区二区三区在线观看 | 久久国内精品自在自线观看 | 欧美成在线播放 | 久久久久久福利 | 亚洲国产精品区 | 好看的看黄a大片爽爽影院 好男人天堂网 | 久久99国产精品久久欧美 | 国内精品久久久久久久久 | 中文字幕亚洲国产 | 特黄特黄一级高清免费大片 | 女让张开腿让男人桶视频 | 中文字幕一区二区在线播放 | 欧美高清性色生活片免费观看 | 久久精品视频久久 | 女人毛片a毛片久久人人 | 免费公开视频人人人人人人人 | 久久91精品国产91久久小草 | 伊人久久青草青青综合 | 午夜精品一区二区三区在线观看 | 国产三级做爰高清在线 | 色综合久久久久 | 久久国产精品-久久精品 | 国产精品久久国产三级国电话系列 | 国产高清视频免费在线观看 | 国产精品久久久久久久久久日本 | 国产精品综合一区二区 | 在线免费观看色 | 农村寡妇女人一级毛片 | 亚洲人妖女同在线播放 | 在线 中文字幕 日韩 欧美 | 成人怡红院视频在线观看 | 嫩小性性性xxxxbbbb | 欧美性色黄大片在线观看 |