python通用编程二阶段:装饰器

一、函数认证

编写装饰器,为多个函数加上认证的功能(用户的账号密码来源于文件)。要求:登录成功一次,后续的函数都无需再输入用户名和密码

db = 'a.txt'
login_status = {'status': False}


def auth(auth_type='file'):
    def auth2(func):
        def wrapper(*args, **kwargs):
            if login_status['status']:
                return func(*args, **kwargs)
            if auth_type == 'file':
                with open(db, encoding='utf-8') as f:
                    dic = eval(f.read())
                name = input('username: ').strip()
                password = input('password: ').strip()
                if name == dic['name'] and password == dic['password']:
                    login_status['status'] = True
                    res = func(*args, **kwargs)
                    return res
                else:
                    print('username or password error')
            elif auth_type == 'sql':
                pass
            else:
                pass

        return wrapper

    return auth2


@auth()
def index():
    print('index')


@auth(auth_type='file')
def home(name):
    print('welcome %s to home' % name)


index()
home('albert')

二、超时重登

编写装饰器,为多个函数加上认证功能,要求登录成功一次,在超时时间内无需重复登录,超过了超时时间,则必须重新登录

写法一

import time
import random

user_data = {
    'user': None,
    'login': False,
    'now_time': time.time()
}
db_username = 'albert'
db_password = '123'


def auth(func):
    def wrapper(*args, **kwargs):
        passed_time = time.time() - user_data['now_time']

        if user_data['user'] and passed_time < 3:
            return func(*args, **kwargs)
        else:
            while True:
                username = input('input your username>>:').strip()
                password = input('input your password>>:').strip()
                if username == db_username and password == db_password:
                    print('login successfully')
                    user_data['user'] = username
                    user_data['login'] = True
                    user_data['now_time'] = time.time()
                    return func(*args, **kwargs)
                else:
                    print('username or password is invalid')

    return wrapper


@auth
def index():
    print('This is index page')


@auth
def home(name):
    print('Welcome %s to home page' % name)


index()
time.sleep(random.randint(2, 4))  # create 2-4 random number
home('albert')

写法二

# 装饰器,认证功能,用户密码来源于文件,设定超时时间,超时需重新登录
import time


current_user = {
    'user': None,
    'login_time':None,
    'timeout':10
}


def timer(func):
    def wrapper(*args, **kwargs):
        start_time = float(current_user['login_time'])
        res = func(*args, **kwargs)
        stop_time = time.time()
        t = stop_time - start_time
        print('已登录时间%.3ss' %t)
        funcs_dict = {
                '1':welcome,
                '2':shopping
        }
        while t < current_user['timeout']:
            choice = input('选择执行函数:')
            funcs_dict[choice]()
        else:
            current_user['user'] = None
            auth(func)

        return res
    return wrapper


def auth(func):
    def wrapper(*args, **kwargs):
        if current_user['user']:
            print('login already')
            return func(*args,**kwargs)
        name = input('username>>:').strip()
        pwd = input('pwd>>:').strip()
        with open('users.txt') as f:
            for line in f:
                if line.startswith(name):
                    info = line.strip().split('|')
                    if name == info[0] and pwd == info[1]:
                        print('login succeed')
                        current_user['user'] = name
                        current_user['login_time'] = time.time()
                        res = func(*args, **kwargs)
                        return res
                    else:
                        print('error')
                        break
    return wrapper


@auth
@timer
def welcome():
    print('welcome')


@auth
@timer
def shopping():
    print('shopping')


welcome()
shopping()

三、日志

编写日志装饰器,实现功能:一旦某函数执行,则将函数执行时间写入到日志文件中,日志文件路径可以指定。

import time


def add_log(file):
    def wrapper(func):
        def inner(*args, **kwargs):
            with open(file, 'a', encoding='utf-8') as f:
                f.write('[%s]:[%s]\n' % (func.__name__, time.strftime('%Y-%m-%d %X')))
                return func(*args, **kwargs)

        return inner

    return wrapper


@add_log('db1.txt')
def index():
    print('This is index page')


@add_log('db2.txt')
def home(name):
    print('Welcome %s to home page' % name)


index()
home('albert')

你可能感兴趣的:(python通用编程,python通用编程)