Rumah  >  Soal Jawab  >  teks badan

penghias kebenaran pengguna flask - Limpahan Tindanan

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中文网2711 hari yang lalu628

membalas semua(2)saya akan balas

  • 迷茫

    迷茫2017-05-18 10:52:23

    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

    balas
    0
  • 给我你的怀抱

    给我你的怀抱2017-05-18 10:52:23

    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

    balas
    0
  • Batalbalas