day1作业:登录接口

Posted (野生程序员)

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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) + "\\n"
            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 + "\\n")
        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) + "\\n"
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 + "\\n"
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你。

 

以上是关于day1作业:登录接口的主要内容,如果未能解决你的问题,请参考以下文章

day1作业:登录接口

day1作业--登录接口

day1作业登录接口总结

day1 作业编写登录窗口

老男孩DAY1作业二

Day1作业要求