- hashlib加密模块
- subprocess模块
- logging日志模块
- 软件开发主要流程
hashlib加密模块
| 1.何为加密 |
| 将明文数据处理成密文数据 让人无法看懂 |
| 2.为什么加密 |
| 保证数据的安全 |
| 3.如何判断数据是否是加密的 |
| 一串没有规律的字符串(数字、字母、符号) |
| 4.密文的长短有何讲究 |
| 密文越长表示使用的加密算法(数据的处理过程)越复杂 |
| 5.常见的加密算法有哪些 |
| md5 base64 hmac sha系列 |
| 6.加密算法基本操作 |
| import hashlib |
| |
| md5 = hashlib.md5() |
| |
| md5.update(b'hello') |
| |
| res = md5.hexdigest() |
| print(res) |
加密补充说明
| 1.加密算法不同 内容如果相同 那么结果肯定相同 |
| md5.update(b'hello~world~python~666') |
| |
| md5.update(b'hello') |
| md5.update(b'~world') |
| md5.update(b'~python~666') |
| 2. 加密之后的结果是无法反解密的 |
| 只能从明文到密文正向推导 无法从密文到明文反向推导 |
| 常见的解密过程其实是提前猜测了很多结果 |
| 123 密文 |
| 321 密文 |
| 222 密文 |
| 3.加盐处理 |
| 在明文里面添加一些额外的干扰项 |
| |
| md5 = hashlib.md5() |
| |
| md5.update('公司设置的干扰项'.encode('utf8')) |
| md5.update(b'hello python') |
| |
| res = md5.hexdigest() |
| print(res) |
| |
| 4.动态加盐 |
| 干扰项是随机变化的 |
| eg:当前时间、用户名部分... |
| 5.加密实战操作 |
| 1.用户密码加密 |
| 2.文件安全性校验 |
| 3.文件内容一致性校验 |
| 4.大文件内容加密 |
| 截取部分内容加密即可 |
subporcess模块
| 模拟操作系统终端 执行命令并获取结果 |
| |
| import subprocess |
| |
| res = subprocess.Popen( |
| 'asdas', |
| shell=True, |
| stdin=subprocess.PIPE, |
| stdout=subprocess.PIPE, |
| ) |
| print('正确结果', res.stdout.read().decode('gbk')) |
| print('错误结果', res.stderr) |
logging日志模块
| 1.如何理解日志 |
| 简单的理解是记录行为举止的操作 |
| 2.日志的级别 |
| 五种级别 |
| 3.日志模块要求 |
| 代码无需掌握 但是要会cv修改 |
| |
| import logging |
| |
| |
| |
| |
| |
| file_handler = logging.FileHandler(filename='x1.log', mode='a', encoding='utf8',) |
| logging.basicConfig( |
| format='%(asctime)s - %(name)s - %(levelname)s -%(module)s: %(message)s', |
| datefmt='%Y-%m-%d %H:%M:%S %p', |
| handlers=[file_handler,], |
| level=logging.ERROR |
| ) |
| |
| logging.error('你好') |
日志的组成
| 1.产生日志 |
| 2.过滤日志 |
| 基本不用 因为在日志产生的阶段就可以控制自己想要的日志内容 |
| 3.输出日志 |
| 4.日志格式 |
| |
| import logging |
| |
| |
| logger = logging.getLogger('购物车记录') |
| |
| |
| hd1 = logging.FileHandler('a1.log', encoding='utf-8') |
| hd2 = logging.FileHandler('a2.log', encoding='utf-8') |
| hd3 = logging.StreamHandler() |
| |
| fm1 = logging.Formatter( |
| fmt='%(asctime)s - %(name)s - %(levelname)s -%(module)s: %(message)s', |
| datefmt='%Y-%m-%d %H:%M:%S %p', |
| ) |
| fm2 = logging.Formatter( |
| fmt='%(asctime)s - %(name)s: %(message)s', |
| datefmt='%Y-%m-%d', |
| ) |
| |
| logger.addHandler(hd1) |
| logger.addHandler(hd2) |
| logger.addHandler(hd3) |
| |
| hd1.setFormatter(fm1) |
| hd2.setFormatter(fm2) |
| hd3.setFormatter(fm1) |
| |
| logger.setLevel(10) |
| |
| logger.debug('写了半天 好累啊 好热啊') |
日志配置字典
| import logging |
| import logging.config |
| |
| standard_format = '[%(asctime)s][%(threadName)s:%(thread)d][task_id:%(name)s][%(filename)s:%(lineno)d]' \ |
| '[%(levelname)s][%(message)s]' |
| simple_format = '[%(levelname)s][%(asctime)s][%(filename)s:%(lineno)d]%(message)s' |
| |
| logfile_path = 'a3.log' |
| LOGGING_DIC = { |
| 'version': 1, |
| 'disable_existing_loggers': False, |
| 'formatters': { |
| 'standard': { |
| 'format': standard_format |
| }, |
| 'simple': { |
| 'format': simple_format |
| }, |
| }, |
| 'filters': {}, |
| 'handlers': { |
| |
| 'console': { |
| 'level': 'DEBUG', |
| 'class': 'logging.StreamHandler', |
| 'formatter': 'simple' |
| }, |
| |
| 'default': { |
| 'level': 'DEBUG', |
| 'class': 'logging.handlers.RotatingFileHandler', |
| 'formatter': 'standard', |
| 'filename': logfile_path, |
| 'maxBytes': 1024 * 1024 * 5, |
| 'backupCount': 5, |
| 'encoding': 'utf-8', |
| }, |
| }, |
| 'loggers': { |
| |
| '': { |
| 'handlers': ['default', 'console'], |
| 'level': 'DEBUG', |
| 'propagate': True, |
| }, |
| |
| |
| |
| |
| |
| }, |
| } |
| logging.config.dictConfig(LOGGING_DIC) |
| |
| |
| |
| |
| logger1 = logging.getLogger('红浪漫顾客消费记录') |
| logger1.debug('慢男 猛男 骚男') |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构