penghias kebenaran pengguna flask - Limpahan Tindanan
PHP中文网
PHP中文网 2017-05-18 10:50:23
0
2
627

Semasa membaca, saya mendapati bahawa kod ini agak mengelirukan, dan penghiasnya agak tidak jelas. Saya harap anda boleh membantu saya menganalisis kod ini! !

from functools import wraps
from flask import abort
from flask_login import current_user
from .models import Permission


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.ADMINISTER)(f)
PHP中文网
PHP中文网

认证高级PHP讲师

membalas semua(2)
迷茫

Mula-mula anda perlu faham prinsip penghias:

@abcd
def f():
    pass

sebenarnya bersamaan dengan pernyataan berikut:

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

Kami kini mempunyai fungsi abcd Intipati fungsi ini ialah: ia menerima fungsi lain sebagai parameter dan mengembalikan fungsi. (Mengenai fungsi yang dikembalikan digunakan, itu terpulang kepada anda). Pada masa ini, abcd hanyalah fungsi, bukan pengubah suai.
Dan kerana permintaan berikut adalah sangat biasa: terdapat fungsi lama, dan kami ingin mentakrifkan fungsi baharu ini secara amnya mempunyai fungsi yang serupa dengan fungsi lama, tetapi mempunyai lebih sedikit fungsi baharu, seperti mencetak a tarikh dan menilai seseorang atau sesuatu. Kemudian fungsi lama pasti akan dipanggil semasa proses mentakrifkan fungsi baru Namun, fungsi baru sebenarnya tidak banyak berubah, dan fungsi lama selalunya tidak berguna (kerana kita biasanya menggunakan fungsi baru kemudian), jadi untuk itu. menghalang ruang nama daripada berubah Untuk mengelakkan kekeliruan dan memudahkan pembangunan, kita hanya boleh menggunakan nama fungsi lama untuk mewakili fungsi baharu iaitu, selepas mentakrifkan fungsi baharu, kita menukar namanya semula kepada f sebelumnya, dan sebelumnya f tiada lagi. Jadi kita boleh melakukan ini: Tentukan fungsi abcd, yang menerima fungsi f dan mengembalikan fungsi baharu, dan kemudian memberikan nilai pulangannya (fungsi baharu) kepada f (nama fungsi dalam python juga boleh diberikan nilai, menjadi satu lagi fungsi). Inilah sebenarnya yang dilakukan oleh sekeping kod kedua saya di atas. Oleh kerana keperluan ini sangat biasa, Python mentakrifkan sintaks khusus untuknya. Tidakkah anda mahu f=abcd(f) setiap kali? . Pada masa ini, abcd menjadi penghias. Memahami hubungan kesetaraan ini, fungsi anda akan lebih mudah difahami: apabila anda menggunakannya di suatu tempat, ia akan kelihatan seperti ini

@permission_required(permission)
def old():
    pass

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

Keutamaan adalah sama, operasi adalah dari kiri ke kanan, dan fungsi yang ditakrifkan di sini dikira terlebih dahulu.

Prosesnya ialah:

old = permission_required(permission)(old)
-> old = decorator(old)
-> old = decorated_function
给我你的怀抱

Semoga kod berikut akan membantu anda

from functools import wraps

def permission_required(permission):
    """返回装饰器,装饰器中使用入参 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):
    """装饰器函数,返回装饰器
    """
    return permission_required(True)(f)

def admin_required_false(f):
    """装饰器函数,返回装饰器
    """
    return permission_required(False)(f)

@admin_required_true
def foo():
    """使用装饰器
    """
    print 'foo'
    
@admin_required_false
def bar():
    """使用装饰器
    """
    print 'bar'

foo()
bar()

Hasil lari:

foo
403
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan
Tentang kita Penafian Sitemap
Laman web PHP Cina:Latihan PHP dalam talian kebajikan awam,Bantu pelajar PHP berkembang dengan cepat!