Python装饰器9-函数装饰器的应用

2019-06-15  本文已影响0人  dnsir

函数装饰器应用场景-权限验证

#! -*- coding: utf-8 -*-
"""
使用场景1: 授权
"""

from functools import wraps

"""
执行每个函数之前,获取验证参数
如果没有验证过,就调用验证函数
如果已经验证过,则执行当前函数
"""

class Req:
    def __init__(self, auth=False, user=''):
        self.auth = auth
        self.user = user

def authenticate(user):
    if user != 'admin':
        return False
    return True


def requires_auth(f):
    @wraps(f)
    def decorated(*args, **kwargs):
        auth = r.auth
        if auth:
            return f(*args, auth=True, **kwargs)
        # 也有可能不是return?
        if not authenticate(r.user):
            return f(*args, auth=False, **kwargs)
        return f(*args, auth=True, **kwargs)

    return decorated

r = Req()

@requires_auth
def access_pic(auth=False):
    if auth:
        print('access pic succ')
    else:
        print('access pic fail')
access_pic()
r.user = 'admin'
access_pic()

执行结果:

access pic fail
access pic succ

小结

Python装饰器在Flask中一个典型的应用场景就是权限验证

上一篇 下一篇

猜你喜欢

热点阅读