python练习---博客登录(装饰器)
程序要求:
1),启动程序,首页面应该显示成如下格式:
欢迎来到博客园首页
1:请登录
2:请注册
3:文章页面
4:日记页面
5:评论页面
6:收藏页面
7:注销
8:退出程序
2),用户输入选项,3~6选项必须在用户登录成功之后,才能访问成功。
3),用户选择登录,用户名密码从register文件中读取验证,三次机会,没成功则结束整个程序运行,成功之后,可以选择访问3~6项,访问页面之前,必须要在log文件中打印日志,
日志格式为-->用户:xx 在xx年xx月xx日 执行了 %s函数,访问页面时,页面内容为:欢迎xx用户访问评论(文章,日记,收藏)页面
4),如果用户没有注册,则可以选择注册,注册成功之后,可以自动完成登录(完成自动登录+5 分),然后进入首页选择。
5),注销用户是指注销用户的登录状态,使其在访问任何页面时,必须重新登录。
6),退出程序为结束整个程序运行。
1 import time
2
3
4 status_dic = {
5 'username': None, #设置一个登录用户
6 'status': False, #用于后面验证是否登录,登录状态
7 }
8
9
10
11 def login(*args): #登录模块
12 with open("login.txt", encoding="utf-8", mode="r") as f:
13 login_list = f.readlines()
14 if args: #判断用户是否登录
15 status_dic['username'] = args[0]
16 status_dic['status'] = True
17 return True
18 else:
19 count = 0
20 while count < 3:
21 if status_dic['status'] == False:
22 username = input("请输入登录用户名:").strip()
23 for i in login_list:
24 if username == eval(i)["name"]: #对用户名进行检查,看是否存在,不存在直接走for循环的else判断,让用户进行注册
25
26 password = input("请登录用户密码:").strip()
27 if password == eval(i)["password"]: #判断密码输入是否正确
28
29 print("login successfully")
30 status_dic['username'] = username
31 status_dic['status'] = True
32 return True
33 else:
34 print("您还有%s次机会" % int(2 - count)) #3次机会验证,都错误会返回登录首页
35 count += 1
36 break
37
38 else:
39 print("检查用户名未注册...")
40 y = input("是否注册(yes/no):").strip()
41 if y == "yes" or y =="y":
42 return register()
43
44 elif y == "no" or y == "n":
45 return home_page()
46 else:
47 print("输入错误...")
48 else:
49 print("错误太多次啦...")
50
51
52 def register(): #注册模块
53 tag = True
54 f1 = open("login.txt", encoding="utf-8", mode="r")
55 login_list = f1.readlines()
56 print("账号注册".center(50,"#"))
57 while tag:
58 username = input("请输入您注册的用户名:").strip()
59 for i in login_list:
60 if username == eval(i)["name"]:
61 print("用户名已经存在,请重新输入")
62 f1.close()
63 break
64 else:
65 password = input("请输入您注册的密码:").strip()
66 f2 = open("login.txt",encoding="utf-8",mode="a")
67 f2.write("{}\n".format({"name": username,"password": password}))
68 tag = False
69 print("注册成功")
70 f2.close()
71 return login(username, password)
72
73
74 def wrapper(func): #登录验证的装饰器
75 def inner1():
76 if status_dic['status']:
77 ret = func()
78 return ret
79 else:
80 print("请先进行登录")
81 if login():
82 ret = func()
83 return ret
84 return inner1
85
86
87 def log(func): #记录日志的装饰器
88 def inner2():
89 localtime = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())
90 f = open("access.log",encoding="utf-8",mode="a+")
91 f.write("用户:{},在{}执行了{}函数\n".format(status_dic['username'],localtime,func.__name__))
92 f.close()
93 ret = func()
94 return ret
95 return inner2
96
97
98 @wrapper #article_page = wrapper(article_page) --> article_page=wrapper(inner2)
99 @log #article_page = log(article_page) article_page = inner2
100 def article_page():
101 print("欢迎%s来到文章页面" % status_dic['username'])
102
103 @wrapper #diary_page = wrapper(diary_page)
104 @log
105 def diary_page():
106 print("欢迎%s来到日记页面" % status_dic['username'])
107
108
109 @wrapper
110 @log
111 def comment_page():
112 print("欢迎%s来到评论页面" % status_dic['username'])
113
114 @wrapper
115 @log
116 def collect_page():
117 print("欢迎%s来到收藏页面" % status_dic['username'])
118
119
120 def log_out():
121 print("%s用户已注销" % status_dic['username'])
122 status_dic['username'] = None
123 status_dic['status'] = False
124
125
126 def Quit_exit():
127 print("退出程序...")
128 return exit()
129
130 dic = {
131 1: login,
132 2: register,
133 3: article_page,
134 4: diary_page,
135 5: comment_page,
136 6: collect_page,
137 7: log_out,
138 8: Quit_exit
139 }
140
141
142
143 def home_page():
144 while True:
145 str = '''##########欢迎来到博客园首页###########
146 1: {}
147 2: {}
148 3: {}
149 4: {}
150 5: {}
151 6: {}
152 7: {}
153 8: {}
154 '''.format('请登录', '请注册', '文章页面', '日记页面', '评论页面', '收藏页面', '注销', '退出程序')
155 print(str)
156 bianhao = input("请输入选择的序列号:").strip()
157 if bianhao.isdigit():
158 bianhao = int(bianhao)
159 if 0 < bianhao <= 8:
160 dic[bianhao]()
161 else:
162 print("输入编号不在范围内")
163 else:
164 print("输入的序列号只能是数字")
165
166 if __name__ == '__main__':
167 home_page()
转载于:https://www.cnblogs.com/watchslowly/p/8877148.html
python练习---博客登录(装饰器)的更多相关文章
- python实战--csdn博客专栏下载器
打算利用业余时间好好研究Python的web框架--web.py,深入剖析其实现原理,体会web.py精巧之美.但在研究源码的基础上至少得会用web.py.思前想后,没有好的Idea,于是打算开发一个 ...
- 简学Python第四章__装饰器、迭代器、列表生成式
Python第四章__装饰器.迭代器 欢迎加入Linux_Python学习群 群号:478616847 目录: 列表生成式 生成器 迭代器 单层装饰器(无参) 多层装饰器(有参) 冒泡算法 代码开发 ...
- python学习博客地址集合。。。
python学习博客地址集合... 老师讲课博客目录 http://www.bootcdn.cn/bootstrap/ bootstrap cdn在线地址 http://www.cnblogs. ...
- Python函数07/有参装饰器/多个装饰器装饰一个函数
Python函数07/有参装饰器/多个装饰器装饰一个函数 目录 Python函数07/有参装饰器/多个装饰器装饰一个函数 内容大纲 1.有参装饰器 2.多个装饰器装饰一个函数 3.今日总结 3.今日练 ...
- 用Python编写博客导出工具
用Python编写博客导出工具 罗朝辉 (http://kesalin.github.io/) CC 许可,转载请注明出处 写在前面的话 我在 github 上用 octopress 搭建了个人博 ...
- 原创翻译-值得关注的10个python语言博客
原文链接 原文链接的网页感觉网络不是很好,不容易上.我在这里就给大家做个翻译吧. 大家好,还记得我当时学习python的时候,我一直努力地寻找关于python的博客,但我发现它们的数量很少.这也是我建 ...
- 值得关注的10个python语言博客(转)
大家好,还记得我当时学习python的时候,我一直努力地寻找关于python的博客,但我发现它们的数量很少.这也是我建立这个博客的原因,向大家分享我自己学到的新知识.今天我向大家推荐10个值得我们关注 ...
- 初学 Python(十五)——装饰器
初学 Python(十五)--装饰器 初学 Python,主要整理一些学习到的知识点,这次是生成器. #-*- coding:utf-8 -*- import functools def curren ...
- 值得关注的10个python语言博客
大家好,还记得我当时学习python的时候,我一直努力地寻找关于python的博客,但我发现它们的数量很少.这也是我建立这个博客的原因,向大家分享我自己学到的新知识.今天我向大家推荐10个值得我们关注 ...
随机推荐
- 使用maven构建 ssm项目 tomcat7插件运行报错, Invalid byte tag in constant pool: 60
错误日志: [WARNING] [WARNING] Some problems were encountered while building the effective settings[WARNI ...
- Golang Web入门(1):自顶向下理解Http服务器
摘要 由于Golang优秀的并发处理,很多公司使用Golang编写微服务.对于Golang来说,只需要短短几行代码就可以实现一个简单的Http服务器.加上Golang的协程,这个服务器可以拥有极高的性 ...
- ThinkPHP3.2.3发送微信模板消息
一.开通模板消息功能 所有服务号都可以在功能->添加功能插件处看到申请模板消息功能的入口,但只有认证后的服务号才可以申请模板消息的使用权限并获得该权限:需要选择公众账号服务所处的2个行业,每月可 ...
- 33.1 File 获取目录下的所有文件及子目录
重要获取功能 String[] list() 返回当前路径下所有的文件和文件夹名称 //注意:只有指向文件夹的File对象才可以调用该方法(指向文件的file对象使用list会报错npe) File[ ...
- mysql yum源安装
部署服务器环境的时候经常要安装mysql,以下是常见的安装方式 源码安装 rpm包安装 yum源安装 这篇主要介绍yum源安装. yum源下载 进入 https://dev.mysql.com/dow ...
- 拓扑排序入门详解&&Educational Codeforces Round 72 (Rated for Div. 2)-----D
https://codeforces.com/contest/1217 D:给定一个有向图,给图染色,使图中的环不只由一种颜色构成,输出每一条边的颜色 不成环的边全部用1染色 ps:最后输出需要注意, ...
- 常见DL网络模型参数
- HTTPie:替代 Curl 和 Wget 的现代 HTTP 命令行客户端
HTTPie 工具是现代的 HTTP 命令行客户端,它能通过命令行界面与 Web 服务进行交互. -- Magesh Maruthamuthu 大多数时间我们会使用 curl 命令或是 wget 命令 ...
- coding++:@DisallowConcurrentExecution 注解的作用
Quartz定时任务默认都是并发执行的,不会等待上一次任务执行完毕,只要间隔时间到就会执行, 如果定时任执行太长,会长时间占用资源,导致其它任务堵塞. 在Spring中这时需要设置concurrent ...
- Java 多线程实现方式一:继承Thread类
java 通过继承Thread类实现多线程很多简单: 只需要重写run方法即可. 比如我们分三个线程去京东下载三张图片: 1.先写个下载类: 注意导入CommonsIO 包 public class ...