Day1作业1:登陆接口(加入日志、注册功能)
流程图如下:

最先考虑使用python中的list,以能取到user_list中的用户信息,但中途发现没有比较好的方法截取取密码,还是新手的缘故,最终选择了使用dict,以方便截取用户名以及相应的密码。
user_list格式如下:
xxx:xxx
xxx:xxx
xxx:xxx
user_lock格式如下:
xxx
xxx
xxx
Code:
#!/usr/bin/env python
# encoding: utf-8
# Auther:ccorz Mail:ccniubi@163.com import time,getpass,os
# 将输入用户赋值于user_name变量
# print('=============',os.popen('pwd').read())
user_name=input('请输入您的用户名:')
# 打开文件user_list,user_lock,赋予读写权限
user_list=open('user_list','r+')
user_lock=open('user_lock','r+')
#设置日志文件,open如果,用追加模式
log_file=open('login.log','a+')
# 设置一个退出标识符
break_flag=0
time_now=time.strftime('%Y-%m-%d %H:%M:%S') #遍历user_lock被锁用户文件
for line in user_lock:
# 设置被锁用户的变量,strip()将字符串两边的空格符去掉
lock_name=line.strip()
#判断输入用户是否与遍历用户相同
if user_name==lock_name:
print('您的用户已被锁定...请尝试其他的用户')
log_file.write('\n%s:被锁定用户%s尝试登陆!'%(time_now,user_name))
#修改退出标识符的值,以便区分既在user_list,又在user_lock的用户
break_flag=1
#退出循环
break
#将空字典赋予变量account
account={}
for line in user_list:
#遍历user_list文件,将一行的字符串去掉空格,并按":"分割为key value,并将key value添加入dict中
account[line.strip().split(':')[0]]=line.strip().split(':')[1]
# print(account) # break_flag==0用来区分在user_list,user_lock中同时存在的用户,
# 如果没有此标识符,上面遍历锁用户文件也会执行以下程序
if user_name in account and break_flag==0:
#设置计数器,初始值为0
count=0
#循环3次
while count < 3:
password=input('请输入%s的密码:'%user_name)
# 校验密码
if password==account[user_name]:
print('欢迎登陆系统.......')
log_file.write('\n%s,user %s had login.'%(time_now,user_name))
# 退出循环
break
else:
# 密码错误,将计数器+1
count+=1
print('%s的密码错误,请重新输入,您还有%s次机会'% (user_name,3-count))
# 循环超过3次,执行下面命令
else:
print('用户%s已经被锁定,请联系管理员!'%user_name)
# 将密码输入超过3此的用户名添加进user_lock,写入日志文件
user_lock.write('\n%s'%user_name)
log_file.write('\n%s:%s is locked!'%(time.strftime('%Y-%m-%d %H:%M:%S'),user_name))
if user_name not in account:
# \033[1;44;33m....\033[0m 高亮显示,并提醒用户无此用户,是否用此用户名注册
regis_or_quit=input('''\033[1;44;33m没有用户%s,是否注册此用户?\033[0m
\033[1;44;33m输入"y"继续注册,输入"q"退出:\033[0m'''%user_name)
#将输入的字符串转化为小写并与y或者q匹配
if regis_or_quit.lower()=='q':
print('Bye!!!!!!!!')
elif regis_or_quit.lower()=='y':
#直接使用user_name注册,第一次输入密码密码,如果不想显示明文密码可用getpass.getpass('...')
regis_pass=input('请输入%s的密码:'%user_name)
#允许两次确认密码,设置循环2次,故也无需设置计数器
for i in range(2):
#确认注册密码,防止用户忘记密码
regis_pass_again=input('请确认注册用户%s的密码:'%user_name)
# 校验注册密码
if regis_pass_again==regis_pass:
# 校验密码成功,将user_name regis_pass两个变量的值写入user_list文件,并提醒用户注册成功
user_list.write('\n%s:%s'%(user_name,regis_pass))
log_file.write('\n%s:%s注册成功'%(time_now,user_name))
print('用户%s注册成功.....'%user_name)
# 退出循环
break
#校验注册密码失败,进入下一次循环
else:
print('\033[1;33;44m密码与上次不一致.......\033[0m')
#密码确认超过两次,注册失败
else:
print('用户%s注册失败'%user_name)
#输入不为y或者q,其他字符串或者回车 空格时,程序显示退出
else:
print('输入不符合规范,程序已退出.....')
#将open的两个账户文件关闭,也可用with open() as xxx,open() as xxxx
user_list.close()
user_lock.close()
log_file.close()
Day1作业1:登陆接口(加入日志、注册功能)的更多相关文章
- day1作业:登录接口
作业一:编写登陆接口 1.输入用户名和密码 2.认证成功后显示欢迎信息 3.输错三次后锁定 思路: (1)用户输入用户名: (2)去锁定文件中验证用户名是否锁定: (3)去当前用户验证用户是否存在: ...
- python 作业 编写登陆接口
# -*- coding:utf-8 -*-import os,sysfor i in range(3):#进行3次循环 blacklist = open(r"C:\Users\Pc4\De ...
- Android后台数据接口交互实现注册功能
首先,在ecplise里面新建一个叫做TestServices的web工程.在WebContent--WEB-INF--libs文件夹下导入两个jar包:mysql-connector-java-6. ...
- day1作业:编写登陆接口
作业一:编写登陆接口 1.输入用户名和密码 2.认证成功后显示欢迎信息 3.输错三次后锁定 思路:要求是编写登陆接口,那么要有一个存放用户信息的模块:三次后锁定,要有一个存放锁定用户信息的模块:我们知 ...
- day1作业一:编写登陆接口
作业一:编写登陆接口 1.输入用户名和密码 2.认证成功后显示欢迎信息 3.输错三次后锁定 Readme: (1)提示用户输入用户名: (2)用户名验证,验证是否已经锁定: (3)是否锁定:已锁定告诉 ...
- Python学习之编写登陆接口(Day1,作业一)
作业一:编写登陆接口 输入用户名密码 认证成功后显示欢迎信息 输错三次后锁定(下次登陆还是锁定) 知识点:while循环,for循环,文件操作,if判断,列表操作 思路: 1.登陆,三次登陆失败,锁定 ...
- day1作业--登录接口
作业:编写登陆接口 输入用户名密码 认证成功后显示欢迎信息 输错三次后锁定 知识: 1.循环的使用: 2.continue,break在循环中中断的作用: 3.文件的写入,读取: 4.各基础知 ...
- 不用框架,原生使用python做注册接口/登陆接口/充值接口的测试,做的数据/代码分离
注意充值时候,cookie的处理方法,还是原来的三种方法 1.操作数据文件 do_exclel.py # -*- conding:utr-8 -*- #@Time :2018/11/8 22:46 ...
- day1作业登录接口总结
作业一:编写登陆接口 1.输入用户名和密码 2.认证成功后显示欢迎信息 3.输错三次后锁定 上面作业,用了几种思路来解决问题:但是本质上其实都是一样的:核心都是对文件的操作,文件的增删改查:并且这些操 ...
- 老男孩Day1作业(一):编写登录接口
需求:编写登陆接口1. 用户输入帐号密码进行登陆2. 用户信息保存在文件内3. 用户密码输入错误三次后锁定用户 1)编写思路 编写思路参考下面GitHub链接中的流程图 https://github. ...
随机推荐
- Nginx页面图片错误 ERR_CONTENT_LENGTH_MISMATCH
现场:nginx代理的网站有的虚拟目录的图片无法正常显示,提示 ERR_CONTENT_LENGTH_MISMATCH,不断刷新页面图片一条一条的显示出来. 解决方法:找到nginx的缓存文件目录,c ...
- eclipse更改jdk版本(1.6》1.7 以此类推)
电脑装了两个版本的JDK,在开发项目的时候默认使用的是高版本的,但是公司又要求用低版本的JDK来编译,肿么办???么事,小编这就来给你支招! eclipse 安装两个版本的JDK 1 打开eclips ...
- char[] byte[] string
C# byte 和 char 可以认为是等价的.但是在文本显示的时候有差异. char 占两个字节,unicode字符 1.内存转换: char转化为byte: public static byte ...
- C# mysql 处理 事务 回滚 提交
MySqlConnection myCon; void iniMysql() { //连接数据库 myCon = new MySqlConnection("server=127.0.0.1; ...
- Matlab与数学建模
一.学习目标. (1)了解Matlab与数学建模竞赛的关系. (2)掌握Matlab数学建模的第一个小实例—评估股票价值与风险. (3)掌握Matlab数学建模的回归算法. 二.实例演练. 1.谈谈你 ...
- Launch4j:An error occurred while starting the application.解决方案
长期使用Processing 2.X进行开发,突然有一天Processing 1.5.1打不开了,报错如下: 按[确定]后窗口消失,但是任务管理器中的“javaw.exe”并没有消失..... 试过各 ...
- Lua chunk文件结构
1.lua执行经过: xx.lua源码文件------->执行(lua虚拟机) 隐式调用luac编译器 我们可以直接用luac命令去编译lua源码文件,然后用编译后的文件运行在lvm(lua虚拟 ...
- JSP带有标签体的自定义标签
新建OutTag类 如何添加jsp-api.jar包 OutTag类详细代码 ``` package bid.zhazhapan.fims.tag; import javax.servlet.jsp. ...
- 【CSP模拟赛】坏天平(数学&思维)
蹭兄弟学校的题目做还不用自己出题的感觉是真的爽 题目描述 nodgd有一架快要坏掉的天平,这架天平右边的支架有问题,如果右边的总重量比左边多太多,天平就彻底坏掉了.现在nodgd手上有n种砝码,质量分 ...
- GO语言html模板
模板 一个模板是一个字符串或一个文件,里面包含了一个或多个由双花括号包含的{{action}}对象.大部分的字符串只是按面值打印,但是对于actions部分将触发其它的行为.每个actions都包含了 ...