进入python的世界_day22_python基础——hashlib模块、subprocess模块、logging日志模块

一、哈希加密模块——hashlib

1.缘由

​ 我们平时登录比如百度啊,腾讯视频啊,输入账号密码成功了就会登录上,如果有人半路截获了这个账号密码,那我们密码就泄露了,所以得把这个密码加密成别人看不懂的样子,有点类似小时候冒险小虎队的解密,一般网址用的加密都是哈希加密基本可以保证数据安全

2.用途

​ 用途1——用于密码密文传输与验证

​ 用途2——用于文件完整性校验

2.方式

​ 加密的方法很多,根据算法不同产生加密数据的长短也不同,一般是生成一大串没有规律的数字、字母、符号组成到一起,注意无论校验的内容有多大,得到的hash值长度是固定的

目前常见的加密算法:

​ md5、base64、各种sha

3.实操

​ !!!先给python安装hashlib模块哦~

import hashlib
a = hashlib.md5() # 指定一下加密算法,变量名随意
a.update()     # 往里面传要加密的数据,注意,最好转字节形式
# 例如 : a.update(bytes(f'{}', encoding='utf8'))
res = a.hexdigest() # 开始加密,加密的结果拿个变量名接收下
print(res)  # 可以打印看下,也可以把这变量名拿着到处用了

4.拼凑

​ 没开始执行加密前,可以拼凑加密内容,有点类似字符串拼接,只要拼出的是一样的东西,拿去加密,得到的结果都是一样的

5.加点难度的加密

​ 正儿八经的加密太小儿科,一般都会加点干扰项

​ 比如说没加密前塞点东西进数据中,,或固定文本或动态内容,这种

手段就称作加盐

6.大文件加密

​ 整个一起加密太耗时间了,可以分段加密,只校验段数处的数据是否一致,段数10+ 20+基本可以完成加密工作

二、subprocess模块

​ 可以模拟操作系统终端 执行命令并获取结果,主要是应用网络编程,目前还不涉及,仅作了解

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.介绍

​ 程序的一种记录行为,可以记录正常的程序访问,还可能有错误、警告等信息的输出

学了这个模块后,用户反馈就别用直接print了

2.分级

debug 调试debug 程序真正上线后不用再输出

info 正常的一些信息

warning 当前有可能出现错误

error 已经出现错误

critical 错误很严重

默认情况下只显示了大于等于WARNING级别的日志

3.基本配置

import logging

logging.basicConfig(
    # 1.日志输出位置:1.终端 2.文件
    filename = 'access.log',   # 不指定,默认打印到终端
                 # 指定本质就是A模式打开一个文件存
     # 记录日志一般是给运维人员看的
    # 2.日志格式
    format='%(asctime)s - %(name)s - %(levelname)s - %(module)s:  %(message)s',

    # 3.时间格式
    datefmt='%Y-%m-%d %H:%M:%S %p',

    # 4.日志级别
    # CRITICAL = 50 #FATAL = CRITICAL
    # ERROR = 40
    # WARNING = 30 #WARN = WARNING
    # INFO = 20
    # DEBUG = 10
    # NOTSET = 0 #不设置
    level=10,  # 意思Debug及以上的日志都会输出了
) 
定义三种日志输出格式,日志中可能用到的格式化串如下
# %(name)s Logger的名字
# %(levelno)s 数字形式的日志级别
# %(levelname)s 文本形式的日志级别
# %(pathname)s 调用日志输出函数的模块的完整路径名,可能没有
# %(filename)s 调用日志输出函数的模块的文件名
# %(module)s 调用日志输出函数的模块名
# %(funcName)s 调用日志输出函数的函数名
# %(lineno)d 调用日志输出函数的语句所在的代码行
# %(created)f 当前时间,用UNIX标准的表示时间的浮 点数表示
# %(relativeCreated)d 输出日志信息时的,自Logger创建以 来的毫秒数
# %(asctime)s 字符串形式的当前时间。默认格式是 “2003-07-08 16:49:45,896”。逗号后面的是毫秒
# %(thread)d 线程ID。可能没有
# %(threadName)s 线程名。可能没有
# %(process)d 进程ID。可能没有
# %(message)s用户输出的消息

四、日志配置字典

​ 日志配置应该写到配置文件去,可以想想如果按照规范目录开发程序,应该把日志配置放到何处呢?

写在前头:这个字典很长,不用记,就当作很简单的字典,会用就行

重点关注:formatters 、handlers、loggers

​ 格式

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]'  # 其中name为getlogger指定的名字
simple_format = '[%(levelname)s][%(asctime)s][%(filename)s:%(lineno)d]%(message)s'
test_format = '[%(asctime)s] %(message)s'
# 上述为准备

LOGGING_DIC = {
    'version': 1,
    'disable_existing_loggers': False,
    'formatters': {   # 键命不能改
        'standard': {    # 可以自定义
            'format': standard_format  # 键名不能改,后面随意加自己想要的格式  >>>最好别动这个,在其他地方改该变量名就行
        },
        'simple': { 
            'format': simple_format
         'test' : {
            'format' : test_format
        }           
    },
    'filters': {},  # 过滤日志
    'handlers': { # 控制日志输出的位置——句柄
        # 打印到终端的日志
        'console': {
            'level': 'DEBUG',# K不能改
            'class': 'logging.StreamHandler',  # 输出到屏幕
            'formatter': 'simple'# 这就关联上前面的simple了
        },
         # 打印到文件的日志,收集info及以上的日志
        'default': {
            'level': 'DEBUG',
            'class': 'logging.handlers.RotatingFileHandler',  # 保存到文件
            'formatter': 'standard',
            'filename': logfile_path,  # 日志文件
            			# 获取log文件夹,再拼出log地址
            'maxBytes': 1024 * 1024 * 5,  # 日志大小 5M
            'backupCount': 5,
            'encoding': 'utf-8',  # 日志文件的编码,再也不用担心中文log乱码了
        },
    },
  # 接下来应该配置日志生产者
    'loggers': {
        # logging.getLogger(__name__)拿到的logger配置
        'kkk': {
            'handlers': ['default', 'console'],  # 这里把上面定义的两个handler都加上,即log数据既写入文件又打印到屏幕
            'level': 'DEBUG',
            # 这里的级别设置,不冲突上面的接收者
            'propagate': True,  # 向上(更高level的logger)传递
        },  # 当键不存在的情况下 (key设为空字符串)默认都会使用该k:v配置
        # '购物车记录': {
        #     'handlers': ['default','console'],  # 这里把上面定义的两个handler都加上,即log数据既写入文件又打印到屏幕
        #     'level': 'WARNING',
        #     'propagate': True,  # 向上(更高level的logger)传递
        # },  # 当键不存在的情况下 (key设为空字符串)默认都会使用该k:v配置
        },
    },      
}
logging.config.dictConfig(LOGGING_DIC) # 自动加载配置
loggerl = logging.getLogger('xxx')
loggerl.debug('666666')
# >>>估计看懵了,接下来实操一下,会用就行
1.日志配置丢在setting.py文件里
2.新建一个src.py核心业务文件
3.导一下setting
4.导一下logging
5.顺着logging 导入config  # 两种都可以导,但是注意调的方 式


posted @ 2022-10-27 21:16  yiwufish  阅读(62)  评论(0)    收藏  举报