• 装饰器应用


    1.编写装饰器,为多个函数加上认证的功能(用户的账号密码来源于文件),
    要求登录成功一次,后续的函数都无需再输入用户名和密码
    注意:从文件中读出字符串形式的字典,可以用eval('{"name":"morgana","password":"123"}')
    转成字典格式
    定义一个字典看用户登录状态
    auth_status={
        'user':None,
        'status':False#状态是没有登录
    }
    def wrapper(fun):
        def inner(*args,**kwargs):
            if auth_status['status']:#如果登录了,就执行fun函数
                ret = fun(*args, **kwargs)  # index/home
                return ret
            else:#如果没有登录,就实现认证功能
                username = input('name:>>').strip()#获取用户名
                password = input('password:>>').strip()#获取密码
                f=open('login.txt','r',encoding='utf-8')#打开文件获取用户的信息
                user_dic=f.read()#读出来的是字符串类型
                zhddict=eval(user_dic)#转换成字典类型
                #print(type(zhddict))#查看eval转换后的类型
                if zhddict.get(username) and password == zhddict[username]:#如果用户名和密码都正确,就显示登陆成功,不正确就显示登录失败
                    print('login successful')
                    auth_status['user']=username #登陆成功后就把用户名放在user里
                    auth_status['status']=True    状态改为True
                    ret = fun(*args,**kwargs)#index/home
                    return ret
                else:
                    print('login faild')
        return inner
    @wrapper #语法糖
    def index():
        print("欢迎来到首页")
    
    @wrapper
    def home():
        print("欢迎回家")
    
    index()
    index()
    home()
    index()
    
    2.编写下载网页内容的函数,
    要求功能是:用户传入一个url,函数返回下载页面的结果
    编写装饰器,实现缓存网页内容的功能:
    具体:实现下载的页面存放于文件中,如果文件内有值(文件大小不为0),就优先从文件中读取网页内容,
    否则,就去下载,然后存到文件中
    
    from urllib.request import urlopen
    url_l=[]#存放
    def huancun(func):
        '''
            实现缓存网页内容的功能
        '''
        def inner(*args,**kwargs):#args传的就是url,那么得到url就得用url = args[0]
            url = args[0]  # 取url
            filename=str(hash(url))#用hash算法吧url转换为数字作为文件名,但是数字不能作为文件名,必须转换成str类型
            if url in url_l:#如果url已经在列表里了,就说明你已经下载过了,就不需要在执行func了,就直接打开就行了
                f=open(filename,'rb')
                ret=f.read()
            else:#如果不在列表里就要把添加到url列表
                url_l.append(url)
                ret = func(*args, **kwargs)
                f=open(filename,'wb')#打开文件
                f.write(ret)#并且用写的方式把它写进文件里
            f.close()
            return ret
        return inner
    
    
    @huancun#get=huancun(get)
    def get(url):#定义一个get函数
        return urlopen(url).read()#返回读取的网页
    print(get('http://www.people.com.cn'))
    print(get('http://www.people.com.cn'))#调用get方法,传一个'http://www.people.com.cn'网址进去
    print(get('http://www.people.com.cn'))
    

      

      

  • 相关阅读:
    团队博客----用户需求调研报告
    结对开发----买书问题
    团队开发----NABC分析
    js 中中括号,大括号使用详解
    FileZilla Server 防火墙端口开启设置 windows 2008 win
    在其他的电脑上配置绿色Jre+tomcat运行环境
    工资发给平庸,高薪给予责任。奖金发给成绩,股权分给态度,荣誉颁给理想!
    SSH框架(四) struts2+spring3.0的登陆示例
    SSH框架(三) struts2的登陆示例
    SSH (Struts2+Spring3.0+Hibernate3)框架(二) 框架的配置
  • 原文地址:https://www.cnblogs.com/morgana/p/8496421.html
Copyright © 2020-2023  润新知