路飞学城Python-Day21(practise)
编写程序, 如下有三点要求:
自定义用户信息数据结构, 写入文件, 然后读取出内容, 利用json模块进行数据的序列化和反序列化
e.g
{
"egon":{"password":"123",'status':False,'timeout':0},
"alex":{"password":"456",'status':False,'timeout':0},
}
定义用户类,定义方法db,例如 执行obj.db可以拿到用户数据结构
在该类中实现登录、退出方法, 登录成功将状态(status)修改为True, 退出将状态修改为False(退出要判断是否处于登录状态).\
密码输入错误三次将设置锁定时间(下次登录如果和当前时间比较大于10秒即不允许登录)
'''
有bug未及时调整
登出函数有问题
'''
import json
import time
def init_info():
user_if = {
"egon":{"password":"",'status':False,'timeout':0},
"alex":{"password":"",'status':False,'timeout':0},
}
with open('user_info','w',encoding='utf-8') as f:
json.dump(user_if,f) def read_info():
with open('user_info','r+',encoding='utf-8') as f:
print(json.load(f,encoding = 'utf-8')) user_name = ''
class User: def db(self):
'''
db方法:调用时打印当前用户信息和信息存储数据格式
:return:
'''
with open('user_info', 'r+', encoding='utf-8') as f:
user_info = json.load(f, encoding='utf-8')
for k, v in user_info.items():
print('username:%s -' % k, type(k),
'password:',[val for val in v.values()][0], type([val for val in v.values()][0]),
'status:',[val for val in v.values()][1], type([val for val in v.values()][1]),
'timeout:', [val for val in v.values()][2], type([val for val in v.values()][2]),
) def login(self):
'''
登录
登录成功将状态(status)修改为True
密码输入错误三次将设置锁定时间(下次登录如果和当前时间比较大于10秒即不允许登录)[个人理解应该是10秒内不能登录,这里的表述有问题]
:return:
'''
count = 0
while count < 3:
username = input('请输入用户名>>>').strip()
password = input('请输入密码>>>').strip()
with open('user_info', 'r+', encoding='utf-8') as f:
user_info = json.load(f, encoding='utf-8')
user_name_list = []
for k in user_info.keys():
user_name_list.append(k)
if username in user_name_list and password == user_info.get(username)['password']:
if user_info.get(username)['timeout'] - time.time()<0:
user_info.get(username)['status'] = True
print('用户:%s 登陆成功' % username)
user_dict = {username:user_info.get(username)}
user_name = username
with open('user_info','w+',encoding='utf-8') as f:
json.dump(user_info, f)
return user_dict[username]
else:
return '用户账号已锁定!'
elif count == 2:
if username in user_name_list:
user_info.get(username)['timeout'] = time.time()+10
with open('user_info','w+',encoding='utf-8') as f:
json.dump(user_info, f)
return '%s账户已锁定'%username else:
return '用户名不存在!' else:
print('账号或密码错误,还有%s次尝试机会'% (3-(count+1)))
count += 1 def logout(self):
'''
退出将状态修改为False(退出要判断是否处于登录状态)
:return:
'''
with open('user_info', 'r+', encoding='utf-8') as f:
user_info = json.load(f, encoding='utf-8')
user_list = []
for k in user_info.keys():
user_list.append(k)
if user_name in user_list:
print('当前登录账户%s'%user_name)
choice = input('请确认是否退出,是:Y 否:N').strip()
if choice == 'y'.upper() or choice == 'y'.lower():
user_info.get(user_name)['status'] = False
with open('user_info', 'w+', encoding='utf-8') as f:
json.dump(user_info, f)
else:
pass
else:
pass us = User()
# us.db()
u = us.login()
路飞学城Python-Day21(practise)的更多相关文章
- 路飞学城—Python爬虫实战密训班 第三章
路飞学城—Python爬虫实战密训班 第三章 一.scrapy-redis插件实现简单分布式爬虫 scrapy-redis插件用于将scrapy和redis结合实现简单分布式爬虫: - 定义调度器 - ...
- 路飞学城—Python爬虫实战密训班 第二章
路飞学城—Python爬虫实战密训班 第二章 一.Selenium基础 Selenium是一个第三方模块,可以完全模拟用户在浏览器上操作(相当于在浏览器上点点点). 1.安装 - pip instal ...
- 路飞学城Python爬虫课第一章笔记
前言 原创文章,转载引用务必注明链接.水平有限,如有疏漏,欢迎指正. 之前看阮一峰的博客文章,介绍到路飞学城爬虫课程限免,看了眼内容还不错,就兴冲冲报了名,99块钱满足以下条件会返还并送书送视频. 缴 ...
- 路飞学城-Python开发集训-第3章
学习心得: 通过这一章的作业,使我对正则表达式的使用直接提升了一个level,虽然作业完成的不怎么样,重复代码有点多,但是收获还是非常大的,有点找到写代码的感觉了,遗憾的是,这次作业交过,这次集训就结 ...
- 路飞学城-Python开发集训-第1章
学习体会: 在参加这次集训之前我自己学过一段时间的Python,看过老男孩的免费视频,自我感觉还行,老师写的代码基本上都能看懂,但是实际呢?....今天是集训第一次交作业的时间,突然发现看似简单升级需 ...
- 路飞学城-Python开发集训-第4章
学习心得: 学习笔记: 在python中一个py文件就是一个模块 模块好处: 1.提高可维护性 2.可重用 3.避免函数名和变量名冲突 模块分为三种: 1.内置标准模块(标准库),查看所有自带和第三方 ...
- 路飞学城-Python开发集训-第2章
学习心得: 这章对编码的讲解超级赞,现在对于编码终于有一点认知了,但还没有大彻大悟,还需要更加细心的琢磨一下Alex博客和视频,以前真的是被编码折磨死了,因为编码的问题而浪费的时间很多很多,现在终于感 ...
- 路飞学城Python-Day19(practise)
# 特性1.继承:2.多态:3.封装 # 1.继承的用处:通过继承就可以解决类与类之间的代码冗余关系 # 2.多态的用处:1.增加了程序的灵活性,以不变应万变,使用者都是同一种形式去调用(func(a ...
- 路飞学城-Python开发-第二章
''' 数据结构: menu = { '北京':{ '海淀':{ '五道口':{ 'soho':{}, '网易':{}, 'google':{} }, '中关村':{ '爱奇艺':{}, '汽车之家' ...
- 路飞学城-Python开发-第三章
# 数据结构: # goods = [ # {"name": "电脑", "price": 1999}, # {"name&quo ...
随机推荐
- HMM隐马尔可夫模型(词语粘合)
HMM用于自然语言处理(NLP)中文分词,是用来描述一个含有隐含未知参数的马尔可夫过程,其目的是希望通过求解这些隐含的参数来进行实体识别,说简单些也就是起到词语粘合的作用. HMM隐马尔可夫模型包括: ...
- tomcat 配置 https 几点注意
1.修改server.xml时候把注释的改改就好,不要添加,免得杂乱. 2.安装openssl openssl-devel autoconf libtool apr tomcat-native 才行. ...
- python中的全局变量、局部变量、实例变量
1.全局变量:在模块内,在所有函数.类外面. 2.局部变量:在函数内,在类方法内(未加self修饰的) 3.静态变量:在类内,但不在类方法内.[共同类所有,值改变后,之后所有的实例对象也改变] 4.实 ...
- 一个很好的JS,ASP二级下拉框联动。
在我们制作网站会员注册信息时,一般会涉及到填写自己所在省/市,如果用input或textarea做成填写形式不太理想.所以大部分网站都会选择联动下来列表形式,做起来也不算很复杂,同时看上去也很轻松. ...
- HDU2516 - 取石子游戏【斐波那契博弈】
基本描述 有一堆个数为n的石子,游戏双方轮流取石子,满足: 先手不能再第一次把所有石子取完: 之后每次可以取的石子数介于1到对手刚取的石子数的2倍之间,包括1和对手取的石子数的2倍. 取最后石子的人 ...
- BFS与DFS模板
搜索问题的解法 DFS(深度优先搜索) BFS(广度优先搜索) backtracking(回溯) DFS模板 void dfs(...) { // 结束递归的条件 if (...) { ..... / ...
- bitset骚操作
bitset的用途挺多的,是一个比较骚的常数优化 一.很多位数的二进制数 poj 2443 http://poj.org/problem?id=2443 直接开个1万位的二进制数,求交就行了. 有关集 ...
- tomcat work目录的作用就是编译每个项目里的jsp文件为java文件如果项目没有jsp页面则这个项目文件夹为空
最近发现,很多网友喜欢把tomcat的work目录里的东西叫做缓存,其实那不是很恰当,work目录只是tomcat的工作目录,也就是tomcat把jsp转换为class文件的工作目录,这也正是为什么它 ...
- mbed
mbed介绍--ARM最新面向IOT的RTOS与平台 文章为本人原创,转载请注明:http://blog.csdn.net/guo8113/article/details/40479303 mbed是 ...
- C4
#include <stdio.h> int main(int argc, const char * argv[]) { // int 占用4个字节 double 占用8个字节 // 只是 ...