• python开发基础作业01:模拟登陆系统


    随老男孩学习python mark

    作业要求及提示:编写登录接口

    '''

    练习程序:编写登录接口

    1. 输入用户名和密码

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

    3. 输错三次后锁定

    输入三次后退出,下次同样用户名再登陆就显示用户已经被锁定,用户锁定信息可以保存在硬盘文件里面,跟硬盘文件进行交互

    不能用shell命令,只能用Python的自带的文件调用的接口(可以对文件增删改查),先学文件处理怎么弄

    4.用户名和密码从文件里面读取,还有一个检查账户锁定的文件

    '''

    作业知识点:

    模拟登陆系统主要练习文件的操作、条件语句、循环等

    1.str.strip([chars]):

    删除字符串前边和后边的所有空格,chars参数可以定制需要删除的字符,可选。

    input().strip()可以去除用户输入时带入的空格,避免产生不必要的错误。

    用法:

    account = input('请输入账号:').strip()

    2.str.upper()

    转换字符串中的所有小写字母为大写字母

    command = input('请输入指令:').strip()

    if command.upper() == 'A':

    add_user(database)

    不管输入的指令给为A或a都会执行此项。

    3.dict.get(key)

    获取字典中的key对应的value,若key不存在则返回None,

    if database.get(account) == None:

    如果key不存在不会报错

    流程图

    代码示例1

    #!/usr/bin/env python
    # -*- coding:utf-8 -*-
    # @Author : "David J"
    ##未利用文件,未实现持续锁定
    import sys
    users_list = {"jdw":"123","smz":"123"}
    locked_count = 0
    log_error_count = 0
    #登录模块
    while True:
        username = input("please input your username:").strip()
        password = input("please input your password:")
        #判断用户名和密码是否相同
        if username in users_list.keys():
            if password == users_list[username]:
                print("登录成功")
                sys.exit()
            else:
                log_error_count += 1
                if log_error_count < 3:
                    print("用户名或密码错误,请重试!")
                else:
                    locked_count = 1
                    print("重试超过三次,已锁定!")
                    sys.exit()
        else:
            log_error_count += 1
            if log_error_count < 3:
                print("用户名错误,请重试!")
            else:
                locked_count = 1
                print("重试超过三次,已锁定!")
                sys.exit()
    

    代码示例2

    #!/usr/bin/env python
    # -*- coding:utf-8 -*-
    # @Author : "David J"
    #登录数据文件UserPassword.txt,实现用户三次错误后锁定
    # 字典和列表的区别:列表是有顺序的,使用索引访问;而字典中的条目是用键keys来访问的
    # 初始化空字典
    user_dict = {}
    # 初始化空列表list,有了空的列表之后,程序就可以向这个列表中增加元素
    user_list = []
    # 用户密码错误的初始值为0
    login_error_count = 0
    # 使用while开始无限制的循环
    while True:
       # 交互式输入登录用户名和密码
       logon_name = input("Pls input your username:")
       pass_word = input("Pls input your password:")
       # 读取用户登录数据文件UserPassword.txt
       '''
       UserPassword.txt示例
       jdw,123456,0,0
       smz,123456,0,0
       root,123456,0,0
       cslc,123456,0,0
       '''
       users_data = open('UserPassword.txt','r')
       # 循环遍历打开的数据,对打开的数据进行格式化操作,然后把格式化以后的数据保存到创建好的user_dict字典当中
       for user_data in users_data:
           # 使用strip去除user_data数据行中的前后空格
           user_list = user_data.strip()
           # 将去除前后空格之后的数据行user_list使用逗号进行分割,并重新保存到user_datas中
           user_datas = user_list.split(',')
           # 将user_datas数据行中的第0个位置的数据(即用户名),去除前后空格后,赋给新的变量user_name
           user_name = user_datas[0].strip()
           # 将user_datas数据行中的第1个位置的数据(即密码),去除前后空格后,赋给新的变量user_passwd
           user_passwd = user_datas[1].strip()
           # 将user_datas数据行中的第2个位置的数据(即锁定状态,0代表未锁定,1代表锁定),去除前后空格后,赋给新的变量user_locked
           user_locked = user_datas[2].strip()
           # 将user_datas数据行中的第3个位置的数据(即密码输入错误次数),去除前后空格后,赋给新的变量user_error_count
           # 将user_datas[3]的数据类型强制转换为int
           user_error_count = int(user_datas[3].strip())
           # 将前面定义好的变量信息,保存到字典中,为前面的值指定键名,即键:值对应的关系,键名可以随便起,建议考虑易读性
           # 如果下面的键名出线下划波浪线,并不代表有语法错误,而是编辑器认为拼写的英文不是正确的英文单词,不影响脚本执行
           # 按照Python的编程规范,在逗号和冒号后面需要加一个空格
           user_dict[user_name] = {'name': user_name, 'password': user_passwd,
                                     'locked': user_locked, 'errorcount': user_error_count}
       # 关闭打开的UserPassword.txt文件
       users_data.close()
       # 判断用户账户是否已经被锁定,将前面交互界面输入的用户名和字典里保存的用户名列进行匹配
       # 将前面交互式输入的用户名和字典中的userlocked键进行匹配,如果用户名对应的键为1,就是被锁定了,退出登录
       if logon_name in user_dict.keys():
           if user_dict[logon_name]['locked'] == '1':
               print("This user was locked,pls contact administrator!")
               break
           # 将前面输入的用户名、密码和字典中的用户名、密码进行匹配,如果成功,则输出登录系统,然后退出
           if logon_name == user_dict[logon_name]['name'] and pass_word == user_dict[logon_name]['password']:
               print("Welcome to System!")
               break
           else:
               # 如果用户名在字典里,但是密码不对,将前面输入的用户名所对应字典中的错误次数进行自增
               user_dict[logon_name]['errorcount'] += 1
               # 如果用户名输入正确的情况下,密码输入错误的次数小于3次,给用户重新尝试的机会
               if user_dict[logon_name]['errorcount'] < 3:
                   print("The password was wrong,pls try again,your have three chance!")
                   # 追加写入新的数据到UserPassword.txt,其中的errorcount会随着失败尝试次数的增加而增加,三次就是2,即0,1,2
                   write_data = open('UserPassword.txt', 'w+')
                   # 将字典里面的值取到_user_value中,进行循环遍历
                   for user_value in user_dict.values():
                       # 往脚本开头定义好的空列表里面逐行写入数据
                       user_list = [user_value['name'], user_value['password'], str(user_value['locked']),
                                     str(user_value['errorcount'])]
                       # 将写入到user_list的数据再次进行格式化后赋给users_list
                       users_list = ','.join(user_list)
                       # 将users_list中的数据写入到UserPassword.txt中,并在每一行数据的结尾进行换行
                       write_data.write(users_list + '
    ')
                   # 关闭UserPassword.txt文档
                   write_data.close()
               else:
                   # 如果密码不正确的次数已经超过3次,就输出账户被锁定
                   print("You try three times,Account locked")
                   # 输出账户锁定的同时,将字典中locked键的值设置为1,这个地方改成1,前面判断Locked状态的IF才生效
                   user_dict[logon_name]['locked'] = 1
                   # 账户设置为锁定之后,将用户对应的错误密码次数清零,我理解的是锁定属性为1了,错误次数可以清零
                   user_dict[logon_name]['errorcount'] = 0
                   write_data = open('UserPassword.txt', 'w+')
                   for user_value in user_dict.values():
                       user_list = [user_value['name'], user_value['password'], str(user_value['locked']),
                                     str(user_value['errorcount'])]
                       users_list = ','.join(user_list)
                       write_data.write(users_list + '
    ')
                   write_data.close()
                   break
       else:
           # 如果用户名不存在,则输出信息
           print("Pls ensure input currect account or password,you can try three times!")
           # 程序开头设置了初始化不存在用户名的值为0,这里进行自增
           login_error_count += 1
           # 如果不存在的用户尝试次数超过3次,则中断程序
           if login_error_count > 2:
               break
    

      

    欢迎沟通交流 CslcCloud
  • 相关阅读:
    android-基础编程-RecyclerView
    android-基础编程-ListView
    LINUX 日志服务器的搭建
    使用parted进行磁盘分区
    raid磁盘阵列
    LVM逻辑卷管理
    /home 分区迁移试验
    PHP 匹配一个汉字
    xhr dojo load
    ERR: Call to undefined function openssl_random_pseudo_bytes()
  • 原文地址:https://www.cnblogs.com/DaweiJ/p/8462830.html
Copyright © 2020-2023  润新知