成人视屏在线观看-国产99精品-国产精品1区2区-欧美一级在线观看-国产一区二区日韩-色九九九

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

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

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

問題描述

看書發(fā)現(xià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)

問題解答

回答1:

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

@abcddef f(): pass

實際上與下面的語句等價:

def f(): passf=abcd(f)

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

@permission_required(permission)def old(): pass

等價于

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

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

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

希望下面代碼對你有幫助

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()

運行結(jié)果:

foo403

標簽: Python 編程
相關(guān)文章:
主站蜘蛛池模板: 国产成人国产在线观看入口 | 欧美一区高清 | 久久一日本道色综合久久 | 色视频一区二区三区 | 在线看片中文字幕 | 欧美激情特级黄aa毛片 | 中国一级毛片特级毛片 | 免费一看一级毛片全播放 | 午夜欧美性欧美 | 伊人色在线观看 | 国产一区二区在免费观看 | 免费a级在线观看播放 | 亚洲天堂免费观看 | 大桥未久在线精品视频在线 | 欧美一级在线观看播放 | 成人亚洲欧美日韩在线 | 欧美成人手机视频免费播放 | 青木玲中文字幕一区二区 | 日本特级淫片免费看 | 国产三级视频在线播放 | 亚洲免费区 | 黄到让你下面湿的视频 | 亚洲在线中文字幕 | 亚洲国产伦理 | 亚洲小视频在线观看 | 亚欧色| 欧美高清性刺激毛片 | 欧美一级毛片高清免费观看 | 亚洲欧美日韩国产综合高清 | 综合久久99久久99播放 | 国产亚洲精品午夜高清影院 | 一级在线视频 | 亚洲精品久久久中文字 | 亚洲成年网 | 精品精品国产高清a毛片 | 色综合久久久久久久 | 国产精品极品美女自在线看免费一区二区 | 日日摸夜夜搂人人要 | 狠狠色丁香婷婷综合久久片 | 欧美一区二区三区在线视频 | 免费一级欧美在线观看视频片 |