logging模塊html
Python的hashlib提供了常見的摘要算法,如MD5,SHA1等等。app
# 什麼是摘要算法呢?摘要算法又稱哈希算法、散列算法。它經過一個函數,把任意長度的數據轉換爲一個長度固定的數據串(一般用16進制的字符串表示)。 # 摘要算法就是經過摘要函數f()對任意長度的數據data計算出固定長度的摘要digest,目的是爲了發現原始數據是否被人篡改過。 # 摘要算法之因此能指出數據是否被篡改過,就是由於摘要函數是一個單向函數,計算f(data)很容易,但經過digest反推data卻很是困難。 # 並且,對原始數據作一個bit的修改,都會致使計算出的摘要徹底不一樣。 # 無論算法多麼不一樣,摘要的功能始終不變 # 對於相同的字符串使用同一個算法進行摘要,獲得的值老是不變的 # 使用不一樣算法對相同的字符串進行摘要,獲得的值應該不一樣 # 無論使用什麼算法,hashlib的使用方式永遠不變
# 摘要算法 # 密碼的密文存儲 # 文件的一致性驗證 # 在下載的時候 檢查咱們下載的文件和遠程服務器上的文件是否一致 # 兩臺機器上的兩個文件 你想檢查這兩個文件是否相等 #目前使用最廣的仍是 MD5 import hashlib # usr = input('username: ') # pwd = input('password: ') # role = input('identity: ') # with open('userinfo','a+',encoding='utf-8') as f: # if usr not in f.read(): # md5 = hashlib.md5() # md5.update(bytes(pwd,encoding='utf-8')) # md5_pwd = md5.hexdigest() # f.write(usr+'|'+md5_pwd+'|'+role) # else: # print('用戶名已經存在') # usr = input('username: ') # pwd = input('password: ') # with open('userinfo') as f2: # for line in f2: # username,passwd,role = line.split('|') # md5 = hashlib.md5() # md5.update(bytes(pwd,encoding='utf-8')) # md5_pwd = md5.hexdigest() # if usr == username and md5_pwd == passwd: # print('登錄成功') # else: # print('wrong info') # 加鹽 防止撞庫破解 md5 ,不過鹽也要複雜點,否則也會被撞庫 import hashlib # 提供摘要算法的模塊 # md5 = hashlib.md5(bytes('鹽',encoding='utf-8')) # # md5 = hashlib.md5() # md5.update(b'123456') # print(md5.hexdigest()) # 動態加鹽 # 用戶名 密碼 # 使用用戶名的一部分或者 直接使用整個用戶名做爲鹽 # import hashlib # 提供摘要算法的模塊 # md5 = hashlib.md5(bytes('鹽',encoding='utf-8')+b'') # # md5 = hashlib.md5() # md5.update(b'123456') # print(md5.hexdigest()) # md5 = hashlib.md5(bytes('看你怎麼撞庫',encoding='utf-8')) md5 = hashlib.md5() md5.update(b'123321') #當若是沒有update這個操做,得出的md5也有值,意思是 空密碼 print(md5.hexdigest()) #對於文件的驗證一致性,是不用加鹽的 #摘要算法的update能夠屢次使用,結果不影響輸出md5的值 # md5 = hashlib.md5() # md5.update(b'123') #兩處update等價於 md5.update(b'123321') # print(md5.hexdigest()) # md5.update(b'321') # print(md5.hexdigest()) with open('somewhere','r',encoding='utf-8') as f: md5 = hashlib.md5() for line in f: md5.update(bytes(line,encoding='utf-8')) # md5.hexdigest() print(md5.hexdigest()) # with open('somewhere','r',encoding='utf-8') as f: f.seek(4) print(f.read()) md5 = hashlib.md5() md5.update(bytes(f.read(),encoding='utf-8')) print(md5.hexdigest()) print(type(md5.hexdigest())) # # for i in range(5): # print('1') # print(i) # with open('somewhere','rb') as f2: # 用r模式和用rb模式,md5校驗碼不一樣 # md5 = hashlib.md5() # for line in f2: # md5.update(line) # # print(md5.hexdigest())
日誌是一種能夠追蹤某些軟件運行時所發生事件的方法。函數
默認狀況下Python的logging模塊將日誌打印到了標準輸出中,且只顯示了大於等於WARNING級別的日誌,這說明默認的日誌級別設置爲WARNING(日誌級別等級CRITICAL > ERROR > WARNING > INFO > DEBUG),默認的日誌格式爲日誌級別:Logger名稱:用戶輸出消息。spa
import logging #create logger logger = logging.getLogger('log_type') logger.setLevel(logging.INFO) # create console handler and set level to debug ch = logging.StreamHandler() ch.setLevel(logging.INFO) # create file handler and set level to warning fh = logging.FileHandler('log_file') fh.setLevel(logging.INFO) # create formatter formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s') # add formatter to ch and fh ch.setFormatter(formatter) fh.setFormatter(formatter) # add ch and fh to logger logger.addHandler(ch) logger.addHandler(fh) #日誌等級按以下順序 # 'application' code # logger.debug('debug message') #記錄一條日誌,等級爲debug # logger.info('info message') # logger.warn('warn message') # logger.error('error message') # logger.critical('critical message')
logging.basicConfig()函數中可經過具體參數來更改logging模塊默認行爲,可用參數有: filename:用指定的文件名建立FiledHandler,這樣日誌會被存儲在指定的文件中。 filemode:文件打開方式,在指定了filename時使用這個參數,默認值爲「a」還可指定爲「w」。 format:指定handler使用的日誌顯示格式。 datefmt:指定日期時間格式。 level:設置rootlogger(後邊會講解具體概念)的日誌級別 stream:用指定的stream建立StreamHandler。能夠指定輸出到sys.stderr,sys.stdout或者文件(f=open(‘test.log’,’w’)),默認爲sys.stderr。若同時列出了filename和stream兩個參數,則stream參數會被忽略。 format參數中可能用到的格式化串: %(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用戶輸出的消息
具體能夠看: 詳細的日誌模塊線程