zoukankan      html  css  js  c++  java
  • day1作业:登录接口

        作业一:编写登陆接口 

        1.输入用户名和密码

        2.认证成功后显示欢迎信息

        3.输错三次后锁定

        思路:

        (1)用户输入用户名;

      (2)去锁定文件中验证用户名是否锁定;

      (3)去当前用户验证用户是否存在;

      (4)用户输入密码,三次输错后锁定

        (5)锁定之后从当前文件中删除用户名,添加到锁定文件中。

        注意文件的读取、修改、写入操作,这些操作是要借助列表来完成的,不然就会导致一些不必要的错误,最后定义一个函数来完成这些操作,使用的时候调用这些函数就可以了。

        列表文件的操作一定要注意换行的处理,如何添加元素进去,这些方法最好借助于列表和字典来读取写入文件,这样能够保持格式的整齐。

        代码如下:

    import os,sys,getpass,collections
    retry_limit = 3   #密码错误三次被锁定
    retry_count = 0   #起始次数是0次
    
    def locked_user(users,filename):
        #用于存放锁定用户的文件,当用户锁定的时候,要从原文件删除,添加到新的文件中
        with open(filename,"w+") as locked_f:
            for key,value in users.items():
                line = []
                line.append(key)
                line.append(value)
                file_line = " ".join(line) + "
    "
                locked_f.write(file_line)
    
    active = True
    if __name__ == "__main__":
        while True:
            username = input("请输入用户名(输入quit退出):")
            with open("account_lock.txt","r") as f:
                user_lists = f.readlines()
                for user_list in user_lists:
                    if user_list.strip() == username:
                        print("您好,你的用户已经被锁定,请联系管理员!")
                        continue    #如果用户锁定,结束当前循环,执行下一次用户输入
                    else:
                        pass
            if username == "quit":
                sys.exit(0)
    
            with open("account.txt") as active_f:
                users_dict = collections.OrderedDict()
                for line in active_f:
                    user,pwd = line.strip().split()
                    users_dict[user] = pwd
    
            if username in users_dict.keys():
                while retry_count < retry_limit:
                    passwd = getpass.getpass("请输入你的密码:")  # 隐藏式输入密码
                    # 判断用户是否在用户列表中
                    if users_dict[username] == passwd:
                        print("欢迎回来,认证成功!")
                        break
                    else:
                        if retry_count != 2:
                            #提示用户注意,还有几次机会将被锁定
                            print("您输入的密码不对,您还有%d次机会,否则系统将被锁定!" % (2 - retry_count))
                        retry_count += 1
    
                else:
                    print("您输入的次数过多,%s已被锁定,请联系管理员" %username)
    
                    #用户锁定之后,要把锁定的用户从当前文件删除,移到锁定文件中
                    users_dict.pop(username)
                    locked_user(users_dict,"account.txt")
                    with open("account_lock.txt","a+") as a_f:
                        a_f.write(username + "
    ")
            else:
                print("对不起,您输入的用户不存在,请重新输入!!!")

        上面代码实现了登录接口的功能,但是有一些小小的瑕疵,就是锁定文件的写入不是很好,会出现两个空行的情形,这种方式就只能写读取之前的文件,放到一个列表中,然后把锁定用户添加到这个列表,重新再次读入文件,下面将对代码进行修正。

     1 import os,sys,getpass,collections
     2 
     3 def locked_user(users,filename):
     4     #用于存放锁定用户的文件,当用户锁定的时候,要从原文件删除,添加到新的文件中
     5     with open(filename,"w+") as locked_f:
     6         for key,value in users.items():
     7             line = []
     8             line.append(key)
     9             line.append(value)
    10             file_line = " ".join(line) + "
    "
    11             locked_f.write(file_line)
    12 
    13 active = True
    14 if __name__ == "__main__":
    15     while True:
    16         retry_limit = 3  # 密码错误三次被锁定,每次循环重置
    17         retry_count = 0  # 起始次数是0次,每次循环重置次数
    18         username = input("请输入用户名(输入quit退出):")
    19         with open("account_lock.txt","r") as f:
    20             user_lists = f.readlines()
    21             for user_list in user_lists:
    22                 if user_list.strip() == username:
    23                     print("您好,你的用户已经被锁定,请联系管理员!")
    24                     break   #如果用户锁定,结束当前循环,执行下一次用户输入
    25                 else:
    26                     pass
    27         if username == "quit":
    28             sys.exit(0)
    29 
    30         with open("account.txt") as active_f:
    31             users_dict = collections.OrderedDict()
    32             for line in active_f:
    33                 user,pwd = line.strip().split()
    34                 users_dict[user] = pwd
    35 
    36         if username in users_dict.keys():
    37             while retry_count < retry_limit:
    38                 passwd = input("请输入你的密码:")  # 隐藏式输入密码
    39                 # 判断用户是否在用户列表中
    40                 if users_dict[username] == passwd:
    41                     print("欢迎回来,认证成功!")
    42                     break
    43                 else:
    44                     if retry_count != 2:
    45                         #提示用户注意,还有几次机会将被锁定
    46                         print("您输入的密码不对,您还有%d次机会,否则系统将被锁定!" % (2 - retry_count))
    47                     retry_count += 1
    48 
    49             else:
    50                 print("您输入的次数过多,%s已被锁定,请联系管理员" %username)
    51 
    52                 #用户锁定之后,要把锁定的用户从当前文件删除,移到锁定文件中
    53                 users_dict.pop(username)
    54                 locked_user(users_dict,"account.txt")
    55                 with open("account_lock.txt","r") as a_f:
    56                     #先读取文件放入一个列表中,以方便下一次读取
    57                     user_lines = a_f.readlines()    #按行读取文件
    58                     user_messages = []
    59                     for user_line in user_lines:
    60                         user_messages.append(user_line.strip())
    61                     user_messages.append(username)  #锁定用户添加到列表中
    62                     print(user_messages)
    63                 with open("account_lock.txt","w+") as write_f:
    64                     #把包含锁定用户的列表重新写会文件中
    65                     for user_message in user_messages:
    66                         user_message = user_message + "
    "
    67                         write_f.write(user_message)
    68 
    69         else:
    70             print("对不起,您输入的用户不存在,请重新输入!!!")
    运行如下:
    请输入用户名(输入quit退出):zeng
    请输入你的密码:222
    您输入的密码不对,您还有2次机会,否则系统将被锁定!
    请输入你的密码:222
    您输入的密码不对,您还有1次机会,否则系统将被锁定!
    请输入你的密码:222
    您输入的次数过多,zeng已被锁定,请联系管理员
    ['chang', 'geng', 'xue', 'zeng']
    请输入用户名(输入quit退出):zhu
    请输入你的密码:333
    您输入的密码不对,您还有2次机会,否则系统将被锁定!
    请输入你的密码:333
    您输入的密码不对,您还有1次机会,否则系统将被锁定!
    请输入你的密码:333
    您输入的次数过多,zhu已被锁定,请联系管理员
    ['chang', 'geng', 'xue', 'zeng', 'zhu']
    请输入用户名(输入quit退出):quit

        代码中,我们在写入文件的时候经过了一步转换,如下图所示:

        上面是文件转换的过程,这种方法是常用的文件处理的形式,但是要注意,使用"w"读取文件的时候,一定要特别注意,这种方式会情况原有的文件内容,一定要谨慎使用,别一不小心把公司文件库情况了,到时候老板pass你。

  • 相关阅读:
    Notice: Only variable references should be returned by reference(PHP版本兼容性问题)
    App 开发:Hybrid 架构下的 HTML5 应用加速方案
    Hybrid App是如何实现网页语言与程序语言的混合?谁占主体?
    前端切图+网页排版的注意事项和经验分享
    php提示 Notice: Use of undefined constant name
    如何预测一个互联网产品的未来—一套关于产品的数学模型
    以 MAMP 为 Mac OS X 安装并设置 PHP开发环境
    关于EINTR错误的理解【转】
    socket中的函数遇见EINTR的处理【转】
    Ubuntu10.04中利用V4L2读取摄像头数据并保存成文件【转】
  • 原文地址:https://www.cnblogs.com/gengcx/p/6939512.html
Copyright © 2011-2022 走看看