有关登录认证的心得
我们在创建一个系统时经常需要进行登录认证,若在一个模块实现登录,则其他模块无需再重复登录,那么怎样实现这一功能呢,我们可以结
合装饰器来完成,下面结合一个简单的明星投票系统来简述这一功能的实现。
投票系统包含“注册”“登录”“票数显示”“投票”及“退出”基本功能,第一步,我们先分别写出实现五个这五个功能的函数。今天记录用装饰器实现认
证功能以,故此处“登录”及“票数显示”两个模块为例来说明。
1 login_flag=False 2 def wrapper(func): 3 def inner(*args,**kwargs): 4 global login_flag 5 if login_flag==True: 6 ret=func(*args,**kwargs) 7 return ret 8 else: 9 login() 10 ret = func(*args, **kwargs) 11 login_flag == True 12 return ret 13 return inner 14 15 def regester(): 16 flag=True 17 while flag: 18 username=input("请输入你的账户名:").strip() 19 password=input("请输入你的密码").strip() 20 with open("user_info",mode="a+",encoding="utf_8")as f1: 21 for line in f1.readlines(): 22 if username in line: 23 print("此用户名已使用,请更换注册") 24 break 25 else: 26 f1.write(username+","+password+"\n") 27 flag=False 28 29 def login(): 30 global login_flag 31 flag=True 32 while flag: 33 user=input("请输入您的用户名:").strip() 34 psd=input("请输入你的密码:").strip() 35 with open("user_info",encoding="utf-8")as f2: 36 for line in f2.readlines(): 37 username,password=line.strip().split(",") 38 if user==username and psd==password: 39 print("欢迎登录!") 40 flag=False 41 login_flag=True 42 43 @wrapper 44 def poll_list(): 45 with open("star_msg",encoding="utf-8")as f3: 46 content=f3.read().strip() 47 print(content) 48 49 def choice(): 50 flag=True 51 while flag: 52 choose=input("****Welcome to the star voting system!****\n\t\t\t1.用户注册\n\t\t\t" 53 "2.用户登录\n\t\t\t3.明星排行榜""\n\t\t\t4.投票界面\n\t\t\t5.退出系统\n" 54 ">>>Please choose your page:").strip() 55 if choose=="1": 56 regester() 57 elif choose=="2": 58 login() 59 elif choose=="3": 60 poll_list() 61 elif choose=="4": 62 vote() 63 else: 64 logout() 65 flag=False 66 choice()
上图是我写的过程中发现注意的问题:
1.总还是忘了在装饰器内部引用全局变量,造成装饰其他函数时每运行一次都需要重复登录,没有达到模块间相互认证的目的
2.判定未登陆的,在其执行完登录操作后一定要改变一下全局变量,这样才能对其他模块关联产生作用