zoukankan      html  css  js  c++  java
  • 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("{}
    ".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("用户:{},在{}执行了{}函数
    ".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

  • 相关阅读:
    vue-cli + webpack 构建vue.js开发环境
    JDK、Eclipse、Myeclipse、Tomcat等各种软件的版本详解(写给对版本和兼容性问题焦头烂额的你)
    总结下var、let 和 const 的区别
    vue双向绑定原理
    Vue中computed和watch的区别
    前端面试题总结
    微信开发之上传素材
    微信开发之向用户群发文本消息
    微信开发之获取用户详细列表
    TPshop入门大纲
  • 原文地址:https://www.cnblogs.com/twodog/p/12137086.html
Copyright © 2011-2022 走看看