第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

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

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

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

慕勒3428872 2018-10-11 18:14:30
看書發(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)
查看完整描述

2 回答

?
精慕HU

TA貢獻(xiàn)1845條經(jīng)驗 獲得超8個贊

from functools import wraps

def 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 decorator

def admin_required_true(f):

    """裝飾器函數(shù),返回裝飾器

    """

    return permission_required(True)(f)

def admin_required_false(f):

    """裝飾器函數(shù),返回裝飾器

    """

    return permission_required(False)(f)

@admin_required_true

def foo():

    """使用裝飾器

    """

    print 'foo'

@admin_required_false

def bar():

    """使用裝飾器

    """

    print 'bar'


foo()

bar()


運行結(jié)果:

foo
403


查看完整回答
反對 回復(fù) 2018-10-21
?
蝴蝶不菲

TA貢獻(xiàn)1810條經(jīng)驗 獲得超4個贊

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

@abcddef f():
    pass

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

def f():
    pass
 f=abcd(f)

我們現(xiàn)在有一個函數(shù)abcd,這個函數(shù)的本質(zhì)是:接受另一個函數(shù)當(dāng)做參數(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ù)就好理解了:當(dāng)你在某處使用的時候,是這樣的

@permission_required(permission)def old():
    pass

等價于

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

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

old = permission_required(permission)(old)
-> old = decorator(old)
-> old = decorated_function


查看完整回答
反對 回復(fù) 2018-10-21
  • 2 回答
  • 0 關(guān)注
  • 1371 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號