加密模塊與subprocess模塊跟日志模塊
hashlib 加密模塊
1.何為加密
將明文數(shù)據(jù)處理成密文數(shù)據(jù) 讓人無法看懂
2.為什么加密
保證數(shù)據(jù)的安全
3.如何判斷數(shù)據(jù)是否是加密的
一串沒有規(guī)律的字符串(數(shù)字、字母、符號(hào))
4.密文的長(zhǎng)短有何講究
密文越長(zhǎng)表示使用的加密算法(數(shù)據(jù)的處理過程)越復(fù)雜
5.常見的加密算法有哪些
md5、base64、hmac、sha系列
6.加密算法基本操作
import hashlib
? ?# 1.選擇加密算法
? ?md5 = hashlib.md5()
? ?# 2.傳入明文數(shù)據(jù)
? ?md5.update(b'hello')
? ?# 3.獲取加密密文
? ?res = md5.hexdigest()
? ?print(res) ?# 5d41402abc4b2a76b9719d911017c592
加密模塊補(bǔ)充說明
1.加密算法不變 內(nèi)容如果相同 那么結(jié)果肯定相同
# md5.update(b'hello~world~python~666') ?# 一次性傳可以
? ?md5.update(b'hello') ?# 分多次傳也可以
? ?md5.update(b'~world') ?# 分多次傳也可以
? ?md5.update(b'~python~666') ?# 分多次傳也可以
2.加密之后的結(jié)果是無法反解密的
只能從明文到密文正向推導(dǎo) 無法從密文到明文反向推導(dǎo)
? ?常見的解密過程其實(shí)是提前猜測(cè)了很多種結(jié)果
? ? 123 ?密文
? ? ? 321 ? ? 密文
? ? 222 ? ? ?密文
3.加鹽處理
在明文里面添加一些額外的干擾項(xiàng)
? ?# 1.選擇加密算法
? ?md5 = hashlib.md5()
? ?# 2.傳入明文數(shù)據(jù)
? ?md5.update('公司設(shè)置的干擾項(xiàng)'.encode('utf8'))
? ?md5.update(b'hello python') ?# 一次性傳可以
? ?# 3.獲取加密密文
? ?res = md5.hexdigest()
? ?print(res) ?# e53024684c9be1dd3f6114ecc8bbdddc
4.動(dòng)態(tài)加鹽
干擾項(xiàng)是隨機(jī)變化的
? ? eg:當(dāng)前時(shí)間、用戶名部分...
5.加密實(shí)戰(zhàn)操作
1.用戶密碼加密
2.文件安全性校驗(yàn)
3.文件內(nèi)容一致性校驗(yàn)
? 4.大文件內(nèi)容加密
? ? 截取部分內(nèi)容加密即可
subprocess模塊
模擬操作系統(tǒng)終端 執(zhí)行命令并獲取結(jié)果
import subprocess
res = subprocess.Popen(
? ?'asdas', ?# 操作系統(tǒng)要執(zhí)行的命令
? ?shell=True, ?# 固定配置
? ?stdin=subprocess.PIPE, ?# 輸入命令
? ?stdout=subprocess.PIPE, ?# 輸出結(jié)果
)
print('正確結(jié)果', res.stdout.read().decode('gbk')) ?# 獲取操作系統(tǒng)執(zhí)行命令之后的正確結(jié)果
print('錯(cuò)誤結(jié)果', res.stderr) ?# 獲取操作系統(tǒng)執(zhí)行命令之后的錯(cuò)誤結(jié)果
日志的組成
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('購(gòu)物車記錄')
# 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('寫了半天 好累啊 好熱啊')
format常用格式說明
%(levelno)s: 打印日志級(jí)別的數(shù)值
%(levelname)s: 打印日志級(jí)別名稱
%(pathname)s: 打印當(dāng)前執(zhí)行程序的路徑,其實(shí)就是sys.argv[0]
%(filename)s: 打印當(dāng)前執(zhí)行程序名
%(funcName)s: 打印日志的當(dāng)前函數(shù)
%(lineno)d: 打印日志的當(dāng)前行號(hào)
%(asctime)s: 打印日志的時(shí)間
%(thread)d: 打印線程ID
%(threadName)s: 打印線程名稱
%(process)d: 打印進(jìn)程ID
%(message)s: 打印日志信息
日志配置字典
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,
? ? ? ? ? ? ? ?# 這里兩個(gè)參數(shù)的意思是一個(gè)日志文件最多寫5M,最多可以存在五個(gè)不同的日志文件,但是當(dāng)數(shù)量達(dá)到五個(gè)之后就會(huì)出現(xiàn)最早的那個(gè)會(huì)被刪除,
? ? ? ? ? ? ? ?# 然后再產(chǎn)生一個(gè)新的文件(類似于覆蓋了最早的那個(gè)文件)
? ? ? ? ? ?'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配置
? ? ? ?# '購(gòu)物車記錄': {
? ? ? ?# ? ? '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('購(gòu)物車記錄')
# logger1.warning('尊敬的VIP客戶 晚上好 您又來啦')
# logger1 = logging.getLogger('注冊(cè)記錄')
# logger1.debug('jason注冊(cè)成功')
logger1 = logging.getLogger('紅浪漫顧客消費(fèi)記錄')
# 當(dāng)這里的getLogger內(nèi)部的參數(shù)如果字典中沒有,就會(huì)自動(dòng)使用字典中名稱為空的那個(gè)模版來執(zhí)行
logger1.debug('慢男 猛男 騷男')
鏈接:https://www.dianjilingqu.com/589073.html