【python作业1回顾】——编写登录接口

@第一周作业要求:编写登录接口

1 作业需求

 编写登录接口:
    一、输入用户名和密码
    二、认证成功后显示欢迎信息
    三、输错三次后锁定

备注:在.py路径下创建文件1和2,文件1是放置用户密码的,文件2是被锁定的用户信息

2 设计思路:

(1)创建两个文件,文件1放置正确的用户名和密码,文件2用来存储被锁定的用户名信息。
(2)输入用户名和密码后先校验用户名是否在文件2中:
~如果在直接提示用户信息被锁定;
~如果不在,校验用户名是否在文件1中:
~如果不在文件1中,提示用户信息不存在;
~如果在文件1中,验证输入的密码是否和存储的相同。
(3)校验用户名和密码是否和文件1相同:
~用户名√,密码√——提示欢迎信息;
~用户名√,密码×——提示密码错误;
用户名×——提示用户信息不存在;
(4)3次账户信息或密码都输错,则锁定最后一次输入的账户,写入文件2。
(5)3次中只要有一次账户和密码输入正确,则不进行下面的继续输入操作了。(也就是不一定是输入3次整。)

3 第一次代码情况

ps:代码很垃圾,是实现一段功能,再写一段功能,然后再组合起来的,所以很乱,时间上断断续续也花费了总共有5个小时吧(一直在修改问题,调试,修改问题)但是最后代码也没写全。

print("*****第一次的代码*****")
error_count = 0
while error_count < 3:
    file_userName = open('1.txt')
    username = input("please inpur your username: ")
    password = input("please input your password: ")

#判定用户的账户是否是被锁定,调取文件2,进行遍历
    with open('2.txt') as i:
        for row in i:
            rows = row.rsplit()
            if rows[0] == username:
                print('Your account has been locked')
            continue

#对用户的账户进行3次输入限定,判定用户名和密码是否一致
    with file_userName as file_obj:
        for line in file_obj:
            lines = line.rsplit()
            if lines[0] == username and lines[1] == password:
                print("welcome to the world......")
                break
            elif lines[0] == username and lines[1] != password:
                print("Your password_message is error!!  Please check it.")
                continue
            elif lines[0] != username and lines[1] == password :
                print("the username is not exist.")
                print(lines[0],lines[1],username,password)
                break
            else:
                continue
    error_count = error_count + 1
    file_userName.close()

#如果输入超过3次将被锁定该账号,即写入文件2中。
else:
    print('you are died')
    file_warning = open('2.txt',"a")
    file_warning.write(username+"\n")
    file_warning.close()

4 存在问题,待优化

代码目前存在问题有
一、不论第3次用户名是否输入正确,都会把第三次的用户名写入锁定文件中,即文件2.txt

二、当用户名在锁定文件中,然后密码又正确,将会执行两次语句,也就是打印出:
Your account has been locked
welcome to the world…
即走了判断是否锁定代码,又走了判定用户名和密码是否正确流程

三、考虑到了用户账号和密码都不存在的情况,但是不知道这个如何实现。在if-else中。

5 参考网上的例子:

'''
编写登录接口:
    1.输入用户名和密码登录
    2.输错三次锁定账户
    3.下次登录还是上次的账户,提示锁定,直接退出(用到文件读写)
    4.成功 后显示登录成功
'''
#lock定义为锁定文件
lock = "E:/Python_learn/day1/lock"
#account定义为账户文件
account = "E:/Python_learn/day1/account"
#计数器
count = 0
#标识器
flag = 1
#定义锁定用户列表为空
lock_user = []
 
#打开锁定文件,并读取锁定账户
f1 = open(lock,'r')
lock_file = f1.readlines()
f1.close()
 
#循环锁定账户,将账户追加到lock_user列表中
for i in lock_file:
    i = i.strip('\n')
    lock_user.append(i)
#打开账户文件,并读取用户和密码
f2 = open(account,'r')
account_file = f2.readlines()
f2.close()
 
while True:
    name = input("input your name:")
    passwd = input("input your password:")
    #如果输入的账户在锁定用户列表中,退出循环;
    if name in lock_user:
        print("user is lock!")
        break
    else:
        #否则计数器加count+1
        count += 1
        #如果count大于2,也就是输错三次
        if count > 2:
            print("错误三次")
            #将账户添加到锁定账户中
            with open(lock,'a') as f:
                f.write("\n" + name)
            break
        #如果count小于2,
        else:
            #循环输入的用户名和密码,是否和账户文件里边的一样
            for i in account_file:
                n1,p1 = i.strip().split()
                if name == n1 and passwd == p1:
                    print("welcome login!!")
                    #如果账户密码一样,flag标识为True
                    flag = True
                #如果输入账户密码和文件存储的不一样,则跳出本次循环
                else:
                    #跳出本次循环
                    continue
        #如果flag标识为True,退出整个循环
        if flag is True:
            break

6 优化后的代码

根据网上的例子优化自己的代码,因为网上的例子并没有提示语句,所以在这个方面我优化后的代码更人性化。但是还有一点未实现,就是当用户名和密码都错的时候,如何提示该用户不存在??(头疼。。。。。)

'''
编写登录接口:
一、输入用户名和密码
二、认证成功后显示欢迎信息
三、输错三次后锁定
author:jiaxiuxiu
备注:在.py路径下创建文件1和2,文件1是放置用户密码的,文件2是被锁定的用户信息

'''
print("*****优化后的代码*****")
error_count = 0

#为了用户名和密码都在正确的情况下,直接跳出循环,不必每次都输入整3次。
flag = 1

#创建一个列表,把锁定的用户名全部放到列表中进行下面的比对
lock_user = []
f1 = open('2.txt')
lock_file = f1.readlines()
f1.close()

#把读取到的文件内容存储在列表中,并且以strip('\n'):移除字符串头尾指定的字符(默认为空格或换行符)或字符序列
for i in lock_file:
    i = i.strip('\n')
    lock_user.append(i)

#对用户的账户进行3次输入限定,判定用户名和密码是否一致
while error_count < 3:
    file_userName = open('1.txt')
    username = input("please inpur your username: ")
    password = input("please input your password: ")

    #判定输入的用户是否在锁定的文件中
    if username in lock_user:
        print('Your account has been locked')
        break
    else:
        #不是锁定的用户,则直接进行密码和用户账户校验逻辑
        #遍历用户密码文件,逐条对比是否满足情况:
        # 1账户和密码都对,提示欢迎 2账户对密码错,提示密码错误 3账户错密码对,提示账户不存在 4账户和密码都错,提示不存在(没有实现出来)
        with file_userName as file_obj:
            for line in file_obj:
                lines = line.rsplit()
                if lines[0] == username and lines[1] == password:
                    print("welcome to the world......")
                    flag = True
                elif lines[0] == username and lines[1] != password:
                    print("Your password_message is error!!  Please check it.")
                    continue
                elif lines[0] != username and lines[1] == password:
                    print("the username is not exist.")
                    break
                else:
                    continue
        error_count = error_count + 1
        file_userName.close()
        #为了用户名和密码都在正确的情况下,直接跳出循环,不必每次都输入整3次。
        if flag is True:
            break

#如果输入超过3次将被锁定该账号,即写入文件2中。
else:
    print('you are died')
    file_warning = open('2.txt',"a")
    file_warning.write(username+"\n")
    file_warning.close()

7 遗留问题

还有一点未实现,就是当用户名和密码都错的时候,如何提示该用户不存在??
因为在代码中遍历是逐条进行遍历的,如图中所示,当username = user2 password = 222222(正确的密码),但是遍历到user1 1111111时,就会提示the username is not exist.所以不能这么写,但是具体怎么实现呢,还未想出来,后面会继续解决。

小声bb:能不能也用文件2的方式呢,把文件用Readlines读取出来,放到列表中,或者整理为字典呢,因此部分还没学到,后面继续补充
【python作业1回顾】——编写登录接口_第1张图片
文件1中存储的正确用户和密码如下图
【python作业1回顾】——编写登录接口_第2张图片

8 注意点和总结

一、Python2 和Python3的输入方法不同:
Python2 —— raw_input() python3 —— input()

二、打开文件后,记得关闭文件,否则报错 open()、 close()

三、读写的文件注意和.py路径相同,或者标明完整路径地址。

四、优化前的代码相同的账户会重复锁定

五、还有一点值得注意,
~优化前:无论第三次输入的用户和密码是否正确,都会被锁定,且会重复锁定。
~优化后:第三次输入的用户和密码错误的话,且已经是锁定的用户的话,将不会再次锁定,因为代码中有(break),可直接跳出循环。

你可能感兴趣的:(python)