python模块补充及购物车小作业
hashlib加密模块
#什么是hashlib模块
ashlib是一个提供字符加密功能的模块,包含MD5和SHA的加密算法,具体支持md5,sha1, sha224, sha256, sha384, sha512等算法
# 加密算法
	加密算法有很多种>>>(将明文变密文的内部规则)
  	算法的难易程度可以根据产生密文的长短来判断
    	越长意味着算法越复杂
        
# 代码示例:
import hashlib
new_md5 = hashlib.md5()  #创建hashlib的md5对象
new_md5.update('字符串')  #将字符串载入到md5对象中 获得md5算法加密
print(new_md5.hexdigest())  #通过hexdigest()方法 获得new_md5对象的16进制md5显示
 """如果字符串中是纯数字和英文 那么直接在前面加b转成bytes类型"""
    
 简单来说。就是三步:
1.建立加密对象
2.对字符串进行算法加密
3.获得16进制显示
#md5算法的特点:
1.压缩性:任意长度的数据,算出的MD5值的长度都是固定的
容易计算:从原数据计算出的MD5值很容易。不管数据多大,很快就能算出一串MD5字符串来
2.抗修改性:对原数据进行任何改动,哪怕修改任何一个字节,生成的MD5值也有会很大的区别
3.强抗碰撞:已知原数据和MD5,想找到一个具有相同MD5值的数据(即伪造数据)是非常困难的
加密加盐处理
#什么是加盐处理:
“加盐”就是对原密码添加额外的字符串 然后再生成MD5值 这样就没有办法进行破解了 除非拿到“加盐”字符串 但碰撞方法也是需要一个一个重新计算MD5值后再进行碰撞对比的,难度也是极其大的
#代码示例:
import hashlib
yan = '!任#意%字^符@'  #定义加盐字符串
pwd = input('>>>')
md5_pwd = hashlib.md5()
md5_pwd.update((pwd+yan).encode('UTF-8'))  #加盐
pwd = md5_pwd.hexdigest()
# 动态加盐
	干扰项动态变化
  	可以是用户名的一部分 也可以当前时间...
    
"""
加密应用场景
1.密码加密如何比对
	用户输入的还是明文但是到了程序里面之后会采用相同的加密算法变成密文
	之后拿着密文与跟数据库里面的密文比对如果一致就是密码正确不一致就是错误
	
2.文件内容一致性校验
	作为软件的提供者 我们在提供安全软件的同时会对给该软件内容做加密处理得到一个该安全软件独有的密文
	用户在下载软件之后也会对内容做相同的加密之后比对两次密文是否一致
	如果是表示中途没有被修改 如果不是表示中途被修改过 可能存在病毒 
"""
针对大文件一致性校验的优化策略
	如果一个文件有10G 那么如果全部读取并加密速度太慢
  这个时候可以考虑对文件内容进行切片读取并加密的操作
logging模块
#什么是logging模块:
logging模块定义的函数和类为应用程序和库的开发实现了一个灵活的事件日志系统
logging模块的日志级别
| 日志等级(level) | 描述 | 级别 | 
| logging.debug('debug message') | 最详细的日志信息,典型应用场景是 问题诊断 | 1 | 
| logging.info('info message') | 信息详细程度仅次于DEBUG,通常只记录关键节点信息,用于确认一切都是按照我们预期的那样进行工作 | 2 | 
| logging.warning('warning message') | 当某些不期望的事情发生时记录的信息(如,磁盘可用空间较低),但是此时应用程序还是正常运行的 | 3 | 
| logging.error('error message') | 由于一个更严重的问题导致某些功能不能正常运行时记录的信息 | 4 | 
| logging.critical('critical message') | 当发生严重错误,导致应用程序不能继续运行时记录的信息 | 5 | 
使用logging提供的模块级别的函数记录日志
写法1:
import logging
logging.debug("This is a debug log.")
logging.info("This is a info log.")
logging.warning("This is a warning log.")
logging.error("This is a error log.")
logging.critical("This is a critical log.")
写法2:
logging.log(logging.DEBUG, "This is a debug log.")
logging.log(logging.INFO, "This is a info log.")
logging.log(logging.WARNING, "This is a warning log.")
logging.log(logging.ERROR, "This is a error log.")
logging.log(logging.CRITICAL, "This is a critical log.")
结果:
WARNING:root:This is a warning log.
ERROR:root:This is a error log.
CRITICAL:root:This is a critical log.
简单功能的购物车练习:
#思路构建:
1.先定义好函数功能部分:
def register():	# 注册功能
def login():	#登录功能
def add_shop_car():	#添加购物车
def cost_shop_car():	#结算购物车
    
2.编写主体代码部分:
func_dict = {'1':register,'2':login,'3':add_shop_car,'4':cost_shop_car}
while True:
    print("""
        1.用户注册
        2.用户登录
        3.添加购物车
        4.结算购物车
    """)
    choice = input("请输入你要选择的功能编号:").strip()
    if choice in func_dict:
        funcname = func_dict.get(choice)
        funcname()
    else:
        print("输入的编号错误")
        
3.设置好路径目录
import json
import os
cr_path = os.path.dirname(os.path.dirname(__file__))
cr1_path = os.path.join(cr_path,'db')
if not os.path.exists(cr1_path):
    os.mkdir(cr1_path)
4.依次编写好各个功能的模块部分
注册功能:
#代码示例:
def register():
    username = input("请输入要注册的用户名:").strip()
    user_name =os.listdir(cr1_path)
    if username in user_name:
        print("用户已存在")
        return
    password = input("请输入你要注册的密码:").strip()
    password2 = input("请再次输入你的密码:").strip()
    if not password == password2:
        print("密码输入不一致")
        return
    file_path = os.path.join(cr1_path,f'{username}.json')
    user_dict = {'username': username, 'password': password, 'balance': 15000, 'shop_car': {}}
    with open(file_path,'w',encoding='utf8') as f1:
        json.dump(user_dict, f1,ensure_ascii=False)
    print(f"用户{username}注册成功")
登录功能:
def login():
    print("登录功能")
    username = input("请输入你的用户名:").strip()
    password = input("请输入你的密码:").strip()
    file_path = os.path.join(cr1_path,f'{username}.json')
    if not os.path.isfile(file_path):
        print('用户名不存在')
        return
    with open(file_path,'r',encoding='utf8')as f1:
        user_dict = json.load(f1)
    if password == user_dict.get('password'):
        print(f"用户{username}登录成功!")
        is_login['username'] = username
    else:
        print("密码错误")
装饰器:
#在选择功能时验证账户是否登录
def login_auth(func_name):
    def inner(*args, **kwargs):
        if is_login.get('username'):
            res = func_name(*args, **kwargs)
            return res
        else:
            print('未登录账号 请先登录')
            login()
    return inner
整体遇到的问题:
#问题1:
if password == user_dict.get('password'):
get里面内未添加引号导致
#问题2:
if target_name not in dict_shop_car:
    
    TypeError: unhashable type: ‘list‘
#问题3:
unhashable type
