有关登录认证的心得

  我们在创建一个系统时经常需要进行登录认证,若在一个模块实现登录,则其他模块无需再重复登录,那么怎样实现这一功能呢,我们可以结

合装饰器来完成,下面结合一个简单的明星投票系统来简述这一功能的实现。

  投票系统包含“注册”“登录”“票数显示”“投票”及“退出”基本功能,第一步,我们先分别写出实现五个这五个功能的函数。今天记录用装饰器实现认

证功能以,故此处“登录”及“票数显示”两个模块为例来说明。

 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+"
")
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!****
			1.用户注册
			"
53                    "2.用户登录
			3.明星排行榜""
			4.投票界面
			5.退出系统
"
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()
View Code

上图是我写的过程中发现注意的问题:

1.总还是忘了在装饰器内部引用全局变量,造成装饰其他函数时每运行一次都需要重复登录,没有达到模块间相互认证的目的

2.判定未登陆的,在其执行完登录操作后一定要改变一下全局变量,这样才能对其他模块关联产生作用

原文地址:https://www.cnblogs.com/wdbgqq/p/9216817.html