常用内置模块(二)--logging、hashlib、

一、logging模块

1、logging作用

   1. 控制日志级别
   2. 控制日志格式
   3. 控制输出的目标为文件

2、日志级别

1 logging.debug('debug日志') # 10
2 logging.info('info日志') # 20
3 logging.warning('warning日志') #30
4 logging.error('error日志')#40
5 logging.critical('critical日志') #50

3、示例

import logging

# 1. logger对象: 负责生产各种级别的日志
logger1 = logging.getLogger('用户交易')  # 日志名用来标识日志的与什么业务有关

# 2. filter对象: 过滤日志(很少使用)

# 3. handler对象: 控制日志输出目标位置,以及编码标准
fh1 = logging.FileHandler('a1.log',encoding='utf-8')
fh2 = logging.FileHandler('a2.log',encoding='utf-8')
ch = logging.StreamHandler()

# 4. formmater对象:控制日志的格式
formatter1 = logging.Formatter(
    fmt='%(asctime)s - %(name)s - %(levelname)s -%(module)s:  %(message)s',
    datefmt='%Y-%m-%d %H:%M:%S %p'
)

formatter2 = logging.Formatter(
    fmt='%(asctime)s - %(levelname)s :  %(message)s',
    datefmt='%Y-%m-%d %H:%M:%S %p'
)

# 5. 绑定logger对象与handler对象
logger1.addHandler(fh1)
logger1.addHandler(fh2)
logger1.addHandler(ch)

# 6. 绑定handler对象与formatter对象

fh1.setFormatter(formatter1)
fh2.setFormatter(formatter1)
ch.setFormatter(formatter2)

# 7. 设置日志级别,有logger对象与handler对象两层关卡,必须都放行最终日志才会放行,通常二者级别相同
logger1.setLevel(10)
fh1.setLevel(10)
fh2.setLevel(10)
ch.setLevel(10)

# 8. 使用logger对象产生日志
logger1.info('ffffffff')

4、log配置字典

LOGGING_DIC = {
    'version': 1,
    'disable_existing_loggers': False,
    'formatters': {
        'standard': {
            'format': standard_format
        },
        'simple': {
            'format': simple_format
        },
    },
    'filters': {},
    'handlers': {
        #打印到终端的日志
        'ch': {
            'level': 'DEBUG',
            'class': 'logging.StreamHandler',  # 打印到终端
            'formatter': 'simple'
        },
        #打印到a1.log文件的日志
        'fh1': {
            'level': 'DEBUG',
            'class': 'logging.FileHandler',  # 保存到文件
            'formatter': 'standard',
            'filename': fh1_path,  # 日志文件的路径
            'encoding': 'utf-8',  # 日志文件的编码,再也不用担心中文log乱码了
        },
        # 打印到a2.log文件的日志
        'fh2': {
            'level': 'DEBUG',
            'class': 'logging.FileHandler',  # 保存到文件
            'formatter': 'simple',
            'filename': fh2_path,  # 日志文件的路径
            'encoding': 'utf-8',  # 日志文件的编码,再也不用担心中文log乱码了
        },

    },
    'loggers': {
        '': {
            'handlers': ['fh1', 'fh2', 'ch'],
            'level': 'DEBUG',
        },
    },
}
logging.config.dictConfig(settings.LOGGING_DIC)

logger1=logging.getLogger('用户交易')
#logger1-> fh1,fh2,ch
logger1.info('复古风刚刚兴起')

logger2=logging.getLogger('用户权限')
#logger2-> fh1,fh2,ch
logger2.error('TOm没有执行权限')
调用log配置字典

二、hashlib模块

十 hashlib模块
# 1、什么叫hash:hash是一种算法(3.x里代替了md5模块和sha模块,主要提供 SHA1, SHA224, SHA256, SHA384, 
SHA512 ,MD5 算法),该算法接受传入的内容,经过运算得到一串hash值
# 2、hash值的特点是: #2.1 只要传入的内容一样,得到的hash值必然一样=====>要用明文传输密码文件完整性校验 #2.2 不能由hash值返解成内容=======》把密码做成hash值,不应该在网络传输明文密码 #2.3 只要使用的hash算法不变,无论校验的内容有多大,得到的hash值长度是固定的

 hash算法就像一座工厂,工厂接收你送来的原材料(可以用m.update()为工厂运送原材料),经过加工返回的产品就是hash值

import hashlib

# 方法一、
# 1. 造出一个hash工厂
m = hashlib.md5()   #=hashlib.sha256()

# 2. 给工厂运送原材料
m.update('hello_baby'.encode('utf-8'))   # 必须是bytes类型
m.update('love_you'.encode('utf-8'))

# 3. 产出产品
print(m.hexdigest())    # 43a09074cc658f190d053f223dcb4497


# 方法二、
# 1. 造出一个hash工厂
m = hashlib.md5('hello_baby'.encode('utf-8'))

# 2. 给工厂运送原材料
m.update('love_you'.encode('utf-8'))

# 3. 产出产品
print(m.hexdigest())    # 43a09074cc658f190d053f223dcb4497
# 一、文件校验
m = hashlib.md5()

with open('test.txt','rb') as f:
    for line in f:
        m.update(line)

print(m.hexdigest())


# 二、密码加密
password = input('>>:').strip()

m = hashlib.md5()
m.update(password.encode('utf-8'))
print(m.hexdigest())

# 密码加盐处理思想,可以在用户输入的密码中加入其他的字符,例如:
password = input('>>:').strip()
m = hashlib.md5()
m.update('天王盖地虎'.encode('utf-8'))   # 进行加盐处理
m.update(password.encode('utf-8'))
print(m.hexdigest())
实际应用
# hmac 模块,用于强制性的加盐处理
 
import hmac
 
m = hmac.new('宝塔镇河妖'.encode('utf-8'))   # new(必须要传入位置参数)
m.update('abc154728'.encode('utf-8'))
 
print(m.hexdigest())

猜你喜欢

转载自www.cnblogs.com/zhangbingsheng/p/10398448.html