def md5(fileMd5): import hashlib md5_value = hashlib.md5() with open(fileMd5,'rb') as f: while True:
#每次读取2048个字节数据 data = f.read(2048) if not data: brea
#计算md5值 md5_value.update(data) return md5_value.hexdigest()
本例我一个登陆验证的装饰器python
#!/usr/bin/env python #-*- coding:utf-8 -*- """ 功能: 登陆验证模块 详细说明: 1.密码文件为passwd 2.passwd未建立或丢失,会提示:密码文件不存在,建议从新注册!! 3.未注册用户登陆会提示:用户名不存在,请您先进行注册! 4.已注册用户登陆时,忘记密码,尝试3次后密码还不正确则退出验证,等一下子则能够从新登陆 5.做为装饰器进行登陆验证 """ import json import hashlib import os pwd = os.getcwd() fileName = os.path.join(pwd,"passwd") #将明文密码经过md5进行加密,返回一个加密后的md5的值 def calc_md5(passwd): md5 = hashlib.md5("haliluya") md5.update(passwd) ret = md5.hexdigest() return ret #新用户注册模块 def register(): #判断密码文件passwd是否存在,存在则载入列表,不存在就从新建立一个空字典 if os.path.exists(fileName): #载入用户列表,数据结构为字典,k=userName,v=passwdMd5 with open("passwd", "r+") as loadsFn: userDB = json.loads(loadsFn.read()) else: userDB = {} #让用户输入用户名 userName = raw_input("姓名:") #标志位:控制循环跳出 flag = True while flag: #用户注册时,需输入两次密码 passwd1 = raw_input("密码:") passwd2 = raw_input("确认密码:") #若是两次密码不一致,则不执行下一步,再次输入密码并进行确认 if not passwd1 == passwd2: continue else: #两次输入密码一致,标志位置为False,下次跳出循环 flag = False #调用calc_md5函数将明文密码转为对应的md5值,用于保存 passwdMd5 = calc_md5(passwd1) #将用户名与密码对应存入字典userDB中 userDB[userName] = passwdMd5 #将用户名和密码存入文件 with open(fileName, "w") as dumpFn: dumpFn.write(json.dumps(userDB)) #用户登陆验证,装饰器 def login(func): def decorater(*args,**kwargs): #判断passwd文件是否存在,存在则载入userDB(用户:密码),不然就从新注册新的passwd文件并返回 if os.path.exists(fileName): with open("passwd", "r+") as loadsFn: userDB = json.loads(loadsFn.read()) else: print "密码文件不存在,建议从新注册!!" register() return name = raw_input("用户名:") #用户名是否存在,存在就继续输入密码,不存在则进行注册 if name in userDB.keys(): flag = True counter = 0 #循环输入密码,密码正确,flag=False(下次直接跳出循环)并执行函数,密码错误则容许尝试3次,超过3次验证失败,退出验证 while flag: passwd = raw_input("密码:") passwdMd5 = calc_md5(passwd) if passwdMd5 == userDB[name]: flag = False func(*args,**kwargs) elif counter > 2: print "您已经尝试了3次,请过会儿再试!!" return else: counter += 1 else: print "用户名不存在,请您先进行注册!" register() return decorater if __name__ == "__main__": @login def hello(): print "Hello world!" hello()