md5模块
def md5(user,pwd): md5 = hashlib.md5(user.encode('utf-8')) #不是两个变量 是变量.encode(),没有等于不是encoding 也可以不加盐 md5.update(pwd.encode('utf-8')) #password.encode() 不是只有password return md5.hexdigest() #hexdigest
格式化
user = 'liuda' pwd = '12345' print(f'{user}{pwd}') #直接填在了括号里了变量,不用再在后面添加
读取文件每一行(i)
with open('register_txt', 'r', encoding='utf-8') as f1: for i in f1: #不是f1.read() user, pwd = i.split('|') #分别赋值
管理员和用户登录模块
# 出错点 # 之前 一直把他放里面和 if 构成一体 每一次执行 因为return 都会退出 for 循环 就不对 def login(user,pwd): #文件里的值(第三个写的好提供以后判断) return随时跳出{字典}用的好 for else 好 with open('userinfo', encoding='utf-8')as f: for line in f: username,password,ident = line.strip().split('|') # print(user , username , get_md5(user,pwd), password) #这个可以用来判断对错 if user == username and get_md5(user,pwd)==password: #判断user不等 都不去判断密码 # if 里的 return 找到值了 返回+退出for循环 return {'result':True,'identify':ident,'username':username} #默认返回元组 最好返回字典 更清晰 else: #返回result 做判断 返回username 做实例化 返回identify(值)对应的键 判断学生、管理员 return {'result':False} #else 放在外面 和 for 构成一体 当for循环完后 还没有找到返回错误
#另一种写法;
with open('userinfo', ‘rb’)as f:
username,password,ident = line.decode('utf-8').strip().split('|')
#因为是以字节的格式读出的,所以需要decode()解码一下
执行函数的模块 (内存地址+())
while flag: operate = [('上传',upload),('下载',download)] #1 这个不是字符串 是内存地址啊 for ind,opt in enumerate(operate,1): print(ind,opt[0]) num = int(input('请输入o您要选择的操作 :')) operate[num-1][1](sk) # ()执行 upload() download()
执行函数的模块 (反射(字符串)+())
dic = {'filename':filename,'filesize':filesize,'operate':'upload'} dic = {'filename':filename,'operate':'download'} dic = {'user': username, 'passwd': password, 'operate': 'login'} if ret['flag']: while True: dic = pro_recv(conn) if hasattr(sys.modules[__name__],dic['operate']): getattr(sys.modules[__name__],dic['operate'])(dic,conn)
#执行upload() login() download()
#这款淡淡的颜色是 RGB(136,136,136) # html 模式是#888888 更深颜色是# 787878 这样 更浅颜色是#c8c8c8
生产者消费者模型
from multiprocessing import Process from multiprocessing import Queue #队列 import time import random def producer(q,name): for i in range(5): food = '水果%s'%i q.put(food) time.sleep(random.uniform(1,5)) print('%s 生产了 %s'%(name,food)) def consumer(q,name): while 1: food = q.get() if not food: break #主进程put(退出指令)退出 这里是指None time.sleep(random.uniform(0,1)) print('%s 吃了 %s'%(name,food)) if __name__ == '__main__': q = Queue() pro_lst = ['paa','pbb','pcc'] con_lst = ['CA','CB','CC','CD','CE'] c_l = [] p_l = [] for con in con_lst: con1 = Process(target=consumer , args=(q,con)) con1.start() c_l.append(con1) for pro in pro_lst: pro1 = Process(target=producer , args=(q,pro)) pro1.start() p_l.append(pro1) for p in p_l: #join()住 为了使producer 生产完所有东西才能退出 p.join() # 防止遗漏 for c in c_l: #刚才没理解程序 把这里join住了因为子进程 q.put(None) #是while 所以一直没退出
#for 列表 发送退出 退出有while的多个con进程
队列的阻塞和不等待
from queue import Queue import queue q = Queue(3) q.put(1) q.put(1) q.put(1)
#q.put(1) #如果有会阻塞在这,因为超出了队列的长度 try : q.put_nowait(1) #会丢失值,造成数据不安全的问题,因为抛异常处理了 except queue.Full: print('队列溢出,输出太多了') q.get() q.get()
q.get()
#q.get() #这里存在会阻塞在这,因为没有值了 try : q.get_nowait() #有则接受,没有则抛异常 except queue.Empty: print('没有值了,错误')
队列不阻塞
#from gevent import monkey;monkey.patch_all() # 不用都可以跳出queue队列输入输出 import gevent from queue import Queue q = Queue(4) def f(): q.put(1) q.put(2) q.put(3) q.put(4) q.put(5) def c(): q.get() q.get() q.get() q.get() gevent.spawn(f)