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

  • 相关阅读:
    mysql复制那点事
    全排列问题
    56. Merge Interval
    2. Add Two Numbers
    20. Valid Parentheses
    121. Best Time to Buy and Sell Stock
    120. Triangle
    96. Unique Binary Search Trees
    91. Decode Ways
    72. Edit Distance
  • 原文地址:https://www.cnblogs.com/twodog/p/12137085.html
Copyright © 2011-2022 走看看