Python面经----Python装饰器模拟用户登陆验证功能

此代码借鉴自Python—装饰器模拟用户登陆验证功能
自己写一遍加深记忆,方便查找

Python装饰器模拟用户登陆验证功能

user_list = [
    {'name': 'sb1', 'password': '123'},
    {'name': 'sb2', 'password': '123'},
    {'name': 'sb3', 'password': '123'},
    {'name': 'sb4', 'password': '123'}
]

client_user = {'name': None, 'login': False}


def auth_func(func):

    def wrapper(*args, **kwargs):
        # 参数检查,判断是否有用户登录,如果有,不用验证,直接执行函数的功能
        if client_user.get('name') and client_user.get('login'):
            return func(*args, **kwargs)

        # 输入用户名和密码
        username = input('用户名:').strip()
        password = input('密码:').strip()
        user = {'name': username, 'password': password}

        # 校验用户名和密码是否正确
        if user in user_list:
            client_user['name'], client_user['login'] = user.get('name'), True
            return func(*args, **kwargs)
        else:
            print('用户名或密码错误')

    return wrapper


@auth_func
def index():
    print('欢迎来到主页')


@auth_func
def home(name):
    print(f"{name},欢迎您")


if __name__ == '__main__':
    print('登陆信息', client_user)
    index()
    print('登陆信息', client_user)
    home('root')

装饰器的单例模式

参考python使用装饰器实现单例模式
描述:在第一个装饰器的基础上将其改为单例模式,自己给面试官说自己会的是装饰器的单例模式

user_list = [
    {'name': 'sb1', 'password': '123'},
    {'name': 'sb2', 'password': '123'},
    {'name': 'sb3', 'password': '123'},
    {'name': 'sb4', 'password': '123'}
]

client_user = {'name': None, 'login': False}


def singleton(cls, *args, **kwargs):
    _instances = dict()

    def get_instance(*args, **kwargs):
        if cls not in _instances:
            _instances[cls] = cls(*args, **kwargs)
        return _instances[cls]

    return get_instance


def auth_func(func):

    def wrapper(*args, **kwargs):
        # 参数检查,判断是否有用户登录,如果有,不用验证,直接执行函数的功能
        if client_user.get('name') and client_user.get('login'):
            return func(*args, **kwargs)

        # 输入用户名和密码
        username = input('用户名:').strip()
        password = input('密码:').strip()
        user = {'name': username, 'password': password}

        # 校验用户名和密码是否正确
        if user in user_list:
            client_user['name'], client_user['login'] = user.get('name'), True
            return func(*args, **kwargs)
        else:
            print('用户名或密码错误')

    return wrapper


@auth_func
def index():
    print('欢迎来到主页')


@singleton
@auth_func
def home(name):
    print(f"{name},欢迎您")


if __name__ == '__main__':
    print('登陆信息', client_user)
    index()
    print('登陆信息', client_user)
    home('root')
    home('admin')

单例模式的结果:
单例模式的结果

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值