hashlib模塊、subprocess模塊、loggin日志模塊及實(shí)戰(zhàn)
hashlib加密模塊
1.何為加密
將明文數(shù)據(jù)處理成密文數(shù)據(jù) 讓人無法看懂
2.為什么加密
保證數(shù)據(jù)的安全
3.如何判斷數(shù)據(jù)是否是加密的
一串沒有規(guī)律的字符串(數(shù)字、字母、符號(hào))
4.密文越長表示使用的加密算法(數(shù)據(jù)的處理過程)越復(fù)雜
5.常見的加密算法有哪些
md5、base64、hmac、sha系列
6.加密算法的基本操作
import hashlib
res = hashlib.md5() ?# 選擇加密算法
res.update(b'hello world') ?# 傳入明文必須是轉(zhuǎn)成二進(jìn)制類型
# res.update('hello world'.encode('utf8'))
# res.update(bytes('hello world', 'utf8'))
轉(zhuǎn)二進(jìn)制的3種方法:
b'數(shù)字與字母'
'字符串'.encode('utf8')
bytes('字符串', 'utf8')
ret = res.hexdigest() ?# 得到密文
print(ret) ? # ?5eb63bbbe01eeed093cb22bb8f5acdc3
加密補(bǔ)充說明
1.加密算法不變 內(nèi)容如果相同 那么結(jié)果肯定相同
可以一次性傳入
re.update(b'hello world')
ree = re.hexdigest()
print(ree) ?# # 5eb63bbbe01eeed093cb22bb8f5acdc3
分多次傳也可以
res.update(b'hello ')
res.update(b'world')
ret = res.hexdigest() ?
print(ret) ?# 5eb63bbbe01eeed093cb22bb8f5acdc3
2.加密之后的結(jié)果是無法分解的
只能從明文到密文正向推導(dǎo) 無法從密文到明文反向推導(dǎo)
? ?常見的解密過程其實(shí)是提前猜測(cè)了很種結(jié)果
3.加鹽處理
在明文里面添加一些額外的干擾項(xiàng)
? ?1.選擇加密算法
? ?2.傳入明文數(shù)據(jù)
4.動(dòng)態(tài)加鹽
干擾項(xiàng)是隨機(jī)變化的 比如當(dāng)前時(shí)間、用戶名...等
5.加密實(shí)戰(zhàn)操作
1.用戶密碼加密
? ?2.文件安全性校驗(yàn)(比如:對(duì)文件的內(nèi)容加密 比對(duì)密文是否正確 如果不一樣則說明有中病毒的風(fēng)險(xiǎn))
? ?3.文件內(nèi)容一致性校驗(yàn)
? ?4.大文件內(nèi)容加密
? ? 截取部分內(nèi)容加密即可
subprocess模塊
模擬操作系統(tǒng)終端 執(zhí)行命令并獲取結(jié)果
import subprocess
res = subprocess.Popen(
? ?'asffa', ?# 操作系統(tǒng)要執(zhí)行的命令
? ?shell=True, ?# 固定配置
? ?stdin=subprocess.PIPE, ?# 輸入命令
? ?stdout=subprocess.PIPE, ?# 輸出結(jié)果
)
print('輸出如下', res.stdout.read().decode('gbk')) ?# 獲取操作系統(tǒng)執(zhí)行命令之后的正確結(jié)果 讀取的內(nèi)容得解碼用gbk解碼 在中國windows電腦系統(tǒng)底層cmd終端用的是gbk
print('哎呀不行了', res.stderr) ?# 獲取操作系統(tǒng)執(zhí)行命令之后的錯(cuò)誤結(jié)果
logging日志模塊
1.如何理日志
簡(jiǎn)單的理解為是記錄行為舉止的操作(古代的史官)
2.日志的級(jí)別
五種級(jí)別: 日志級(jí)別等級(jí)CRITICAL > ERROR > WARNING > INFO > DEBUG
3.日志模塊要求
代碼無需掌握 但是要懂得如何拷貝并稍作修改就能使用
import logging
file_handler = logging.FileHandler(filename='x1.log', mode='a',encoding='utf8')
logging.basicConfig(format='%(asctime)S - %(name)s - %(levename)s - %(module)s: %(message)s', datefmt'%Y-%m-%d %H:%M:%S %p',handlers=[file_handler,],level=logging.ERROR)
loggin.error('嗨嘍')
日志的組成
1.日志的產(chǎn)生
2.日志的過濾
基本不用 因?yàn)樵谌罩井a(chǎn)生階段就可以控制想要的日志內(nèi)容
3.輸出日志
4.日志格式
import logging
# 1.日志的產(chǎn)生(準(zhǔn)備原材料) ? ? ? ?logger對(duì)象
logger = logging.getLogger('購物車記錄')
# 2.日志的過濾(剔除不良品) ? ? ? ?filter對(duì)象>>>:可以忽略 不用使用
# 3.日志的產(chǎn)出(成品) ? ? ? ? ? ? handler對(duì)象
hd1 = logging.FileHandler('a1.log', encoding='utf-8') ?# 輸出到文件中
hd2 = logging.FileHandler('a2.log', encoding='utf-8') ?# 輸出到文件中
hd3 = logging.StreamHandler() ?# 輸出到終端
# 4.日志的格式(包裝) ? ? ? ? ? ? format對(duì)象
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',
)
# 5.給logger對(duì)象綁定handler對(duì)象
logger.addHandler(hd1)
logger.addHandler(hd2)
logger.addHandler(hd3)
# 6.給handler綁定formmate對(duì)象
hd1.setFormatter(fm1)
hd2.setFormatter(fm2)
hd3.setFormatter(fm1)
# 7.設(shè)置日志等級(jí)
logger.setLevel(10) ?# debug
# 8.記錄日志
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]' ?# 其中name為getlogger指定的名字
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'
? ? ? ?},
? ? ? ?# 打印到文件的日志,收集info及以上的日志
? ? ? ?'default': {
? ? ? ? ? ?'level': 'DEBUG',
? ? ? ? ? ?'class': 'logging.handlers.RotatingFileHandler', ?# 保存到文件
? ? ? ? ? ?'formatter': 'standard',
? ? ? ? ? ?'filename': logfile_path, ?# 日志文件
? ? ? ? ? ?'maxBytes': 1024 * 1024 * 5, ?# 日志大小 5M
? ? ? ? ? ?'backupCount': 5,
? ? ? ? ? ?'encoding': 'utf-8', ?# 日志文件的編碼,再也不用擔(dān)心中文log亂碼了
? ? ? ?},
? ?},
? ?'loggers': {
? ? ? ?# logging.getLogger(__name__)拿到的logger配置
? ? ? ?'': {
? ? ? ? ? ?'handlers': ['default', 'console'], ?# 這里把上面定義的兩個(gè)handler都加上,即log數(shù)據(jù)既寫入文件又打印到屏幕
? ? ? ? ? ?'level': 'DEBUG',
? ? ? ? ? ?'propagate': True, ?# 向上(更高level的logger)傳遞
? ? ? ?}, ?# 當(dāng)鍵不存在的情況下 (key設(shè)為空字符串)默認(rèn)都會(huì)使用該k:v配置
? ? ? ?# '購物車記錄': {
? ? ? ?# ? ? 'handlers': ['default','console'], ?# 這里把上面定義的兩個(gè)handler都加上,即log數(shù)據(jù)既寫入文件又打印到屏幕
? ? ? ?# ? ? 'level': 'WARNING',
? ? ? ?# ? ? 'propagate': True, ?# 向上(更高level的logger)傳遞
? ? ? ?# }, ?# 當(dāng)鍵不存在的情況下 (key設(shè)為空字符串)默認(rèn)都會(huì)使用該k:v配置
? ?},
}
logging.config.dictConfig(LOGGING_DIC) ?# 自動(dòng)加載字典中的配置
# logger1 = logging.getLogger('購物車記錄')
# logger1.warning('尊敬的VIP客戶 晚上好 您又來啦')
# logger1 = logging.getLogger('注冊(cè)記錄')
# logger1.debug('jason注冊(cè)成功')
logger1 = logging.getLogger('紅浪漫顧客消費(fèi)記錄')
logger1.debug('慢男 猛男 騷男')
配置參數(shù)
logging.basicConfig()函數(shù)中可通過具體參數(shù)來更改logging模塊默認(rèn)行為,可用參數(shù)有:
filename:用指定的文件名創(chuàng)建FiledHandler,這樣日志會(huì)被存儲(chǔ)在指定的文件中。
filemode:文件打開方式,在指定了filename時(shí)使用這個(gè)參數(shù),默認(rèn)值為“a”還可指定為“w”。
format:指定handler使用的日志顯示格式。
datefmt:指定日期時(shí)間格式。
level:設(shè)置rootlogger(后邊會(huì)講解具體概念)的日志級(jí)別
stream:用指定的stream創(chuàng)建StreamHandler。可以指定輸出到sys.stderr,sys.stdout或者文件(f=open(‘test.log’,’w’)),默認(rèn)為sys.stderr。若同時(shí)列出了filename和stream兩個(gè)參數(shù),則stream參數(shù)會(huì)被忽略。
format參數(shù)中可能用到的格式化串:
%(name)s Logger的名字
%(levelno)s 數(shù)字形式的日志級(jí)別
%(levelname)s 文本形式的日志級(jí)別
%(pathname)s 調(diào)用日志輸出函數(shù)的模塊的完整路徑名,可能沒有
%(filename)s 調(diào)用日志輸出函數(shù)的模塊的文件名
%(module)s 調(diào)用日志輸出函數(shù)的模塊名
%(funcName)s 調(diào)用日志輸出函數(shù)的函數(shù)名
%(lineno)d 調(diào)用日志輸出函數(shù)的語句所在的代碼行
%(created)f 當(dāng)前時(shí)間,用UNIX標(biāo)準(zhǔn)的表示時(shí)間的浮 點(diǎn)數(shù)表示
%(relativeCreated)d 輸出日志信息時(shí)的,自Logger創(chuàng)建以 來的毫秒數(shù)
%(asctime)s 字符串形式的當(dāng)前時(shí)間。默認(rèn)格式是 “2003-07-08 16:49:45,896”。逗號(hào)后面的是毫秒
%(thread)d 線程ID。可能沒有
%(threadName)s 線程名??赡軟]有
%(process)d 進(jìn)程ID??赡軟]有
%(message)s用戶輸出的消息
鏈接:https://www.dianjilingqu.com/589063.html