hashlib模塊
主要提供字符加密算法功能,如md5、sha1、sha224、sha512、sha384等,這里的加密算法稱為摘要算法。什么是摘要算法?它又稱為哈希算法、散列算法,它通過一個函數把任意長度的數據轉換為一個長度固定的數據串(通常以16進制符表示)
摘要算法的作用主要在于密碼的密文存儲,以及文件的一致性驗證(比如在下載的時候,檢查我們下載的文件和遠程服務器上的文件是否一致;兩臺機器上的兩個文件,檢查上面的文件是否相等)
使用md5算法:
import
hashlib
md5
=
hashlib.md5()
md5.update(b
'
python123
'
)
#
這里傳入的數據類型必須是bytes類型
print
(md5.hexdigest())
#
affaf271b3ebb2db157a04874259cdcb
使用sha1算法:
import
hashlib
sha1
=
hashlib.sha1()
sha1.update(b
'
python123
'
)
#
這里傳入的數據類型必須是bytes類型
print
(sha1.hexdigest())
#
1854a7d8c2651e57acc7771b6644dfbf46b8ec98
使用sha512算法:
import
hashlib
sha512
=
hashlib.sha512()
sha512.update(b
'
python123
'
)
#
這里傳入的數據類型必須是bytes類型
print
(sha512.hexdigest())
#
e0420e412c80aaa3ce59408884317104dbc708f49bec8542574d11459ffda18ecb12489
#
acf7893fd58ab2b57b8164c9d981096e5dfdbe6518423000301047fe6
從上面我們可以發現不管算法有多么不同,摘要的功能始終是不變的;對于相同的字符串使用同一個算法進行摘要,得到的值總是不變的;
使用不同的算法對相同的字符串進行摘要,得到的值應該不同;當使用sha算法時,隨著算法的復雜難度的增加,摘要的時間成本和空間成本都會增加。
模擬用戶登錄:
我們創建一個'DB'的txt文檔,并在里面寫入用戶信息
asd|affaf271b3ebb2db157a04874259cdcb
import
hashlib
usn
= input(
'
Input username:
'
)
pw
= input(
'
Input password:
'
)
with open (
'
DB
'
) as f:
for
lines
in
f:
username,password
= lines.split(
'
|
'
)
md5
=
hashlib.md5()
md5.update(bytes(pw,encoding
=
'
utf-8
'
))
md5_pwd
=
md5.hexdigest()
if
usn == username
and
md5_pwd ==
password:
print
(
'
登入成功!
'
)
else
:
print
(
'
登入失敗!
'
)
#
Input username:asd
#
Input password:python123
#
登入成功!
因此網站上的用戶名及用戶密碼都是將它們轉化成一個密令存放到數據庫中,而對于開發工作者他們并不能直接看到用戶的信息,只能看到由算法產生的密令。既然有了加密的算法來保護數據,那么也就會有人想要通過其他手段去獲得用戶的信息,他們主要根據一個數據庫的密令全集去比對密令是否相等,如果相等那么就可以拿到這個用戶的密碼了。
'加鹽'
import
hashlib
#
沒加鹽
md5 =
hashlib.md5()
md5.update(b
'
123
'
)
print
(md5.hexdigest())
#
202cb962ac59075b964b07152d234b70
#
加了鹽
md5 = hashlib.md5(bytes(
'
salt
'
,encoding=
'
utf-8
'
))
md5.update(b
'
123
'
)
print
(md5.hexdigest())
#
8c4fb7bf681156b52fea93442c7dffc9
加了鹽后能夠讓用戶的信息不能夠直接通過一個數據全集將用戶密碼的密令去比對出來,讓用戶信息更有安全性
其他
import
hashlib
#
不拆分
md5 =
hashlib.md5()
md5.update(b
'
123
'
)
print
(md5.hexdigest())
#
202cb962ac59075b964b07152d234b70
#
拆分
md5 =
hashlib.md5()
md5.update(b
'
1
'
)
md5.update(b
'
2
'
)
md5.update(b
'
3
'
)
print
(md5.hexdigest())
#
202cb962ac59075b964b07152d234b70
把數據拆開去加密和拆開去加密其實最后的結果都是一樣的
?
configparser模塊
該模塊適用于配置文件的格式與windows ini文件類似,可以包含一個或多個節(section),每個節可以有多個參數(鍵=值)
利用configparser生成的文件格式
[DEFAULT]
location
=
upper left
visible
=
yes
editable
=
no
color
=
blue
[main]
title
=
Main Menu
color
=
green
[options]
title
= Options
如何利用python生成這樣一個文檔?
#
[DEFAULT]
#
location = upper left
#
visible = yes
#
editable = no
#
color = blue
#
#
[main]
#
title = Main Menu
#
color = green
#
#
[options]
#
title = Options
import
configparser
config
=
configparser.ConfigParser()
config[
'
DEFAULT
'
] = {
'
location
'
:
'
upper left
'
,
'
visible
'
:
'
yes
'
,
'
color
'
:
'
blue
'
}
config[
'
main
'
] =
{}
config[
'
main
'
][
'
title
'
] =
'
Main Meue
'
config[
'
main
'
][
'
color
'
] =
'
green
'
config[
'
options
'
] =
{}
config_op
= config[
'
options
'
]
config_op[
'
title
'
] =
'
Options
'
config[
'
DEFAULT
'
][
'
editable
'
] =
'
no
'
with open (
'
config.ini
'
,
'
w
'
) as configfile:
config.write(configfile)
查
import
configparser
config
=
configparser.ConfigParser()
print
(config.sections())
#
[]
config.read(
'
config.ini
'
)
print
(config.sections())
#
['main', 'options']
print
(
'
main
'
in
config)
#
True
print
(
'
options
'
in
config)
#
True
print
(
'
Options
'
in
config)
#
False
print
(config[
'
main
'
])
#
print
(config[
'
options
'
])
#
print
(config[
'
main
'
][
'
color
'
])
#
green
print
(config[
'
options
'
][
'
title
'
])
#
Options
for
key
in
config[
'
main
'
]:
#
title
print
(key)
#
color
#
location
#
visible
#
editable 注意,有default會默認default的鍵
print
(config.options(
'
main
'
))
#
['title', 'color', 'location', 'visible', 'editable']
print
(config.items(
'
main
'
))
#
[('location', 'upper left'), ('visible', 'yes'), ('color', 'green'),
#('editable', 'no'), ('title', 'Main Meue')]
print
(config.get(
'
main
'
,
'
visible
'
))
#
yes 獲得該鍵下對應的值
增刪改
import
configparser
config
=
configparser.ConfigParser()
config.read(
'
config.ini
'
)
config.add_section(
'
map
'
)
#
增加一個新的節
config.remove_section(
'
options
'
)
#
刪除一個節
config.remove_option(
'
main
'
,
'
color
'
)
config.set(
'
map
'
,
'
k1
'
,
'
v1
'
)
config.set(
'
main
'
,
'
k2
'
,
'
v2
'
)
config.write(open(
'
config.ini
'
,
'
w
'
))
#
[DEFAULT]
#
location = upper left
#
visible = yes
#
color = blue
#
editable = no
#
#
[main]
#
title = Main Meue
#
k2 = v2
#
#
[map]
#
k1 = v1
?
logging模塊
即日志模塊,即主要用來記錄用戶的行為或者代碼的執行過程
這里定義了幾種日志等級:
DEBUG :最詳細的日志信息,典型應用場景是應用診斷
INFO:
信息詳盡程度僅次于DEBUG,通常只記錄關鍵節點信息,用于確認一切是按照我們預期的那樣進行工作
WARNING: 當某些不期望的事情發生時記錄的信息(如磁盤可用空間較低),但是此時應用程序還是正常運行的
ERROR: 由于一個更嚴重的問題導致某些功能不能正常運行時記錄的信息
CRITICAL: 當發生嚴重錯誤,導致應用程序不能繼續運行時記錄的信息
日志的等級:DEBUG < INFO < WARNING < ERROR < CRITICAL
配置一個簡單的日志 :
import
logging
logging.debug(
'
DEBUG!
'
)
logging.info(
'
INFO!
'
)
logging.warning(
'
WARNING!
'
)
logging.error(
'
ERROR!
'
)
logging.critical(
'
CRITICAL
'
)
#
WARNING:root:WARNING!
#
ERROR:root:ERROR!
#
CRITICAL:root:CRITICAL
根據輸出的結果我們可以看到這里只打印出了高于INFO級別的日志,可以說這里的默認級別設置為WARNING
默認的輸出格式為 默認的日志格式為日志級別:Logger名稱:用戶輸出消息
通過 basicConfig()調整日志級別和輸出格式
import
logging
logging.basicConfig(level
=
logging.DEBUG,
format
=
'
%(asctime)s %(name)s %(levelname)s %(message)s
'
,
datefmt
=
'
%Y-%m-%d %H:%M:%S %a
'
)
logging.debug(
'
DEBUG!
'
)
logging.info(
'
INFO!
'
)
logging.warning(
'
WARNING!
'
)
logging.error(
'
ERROR!
'
)
logging.critical(
'
CRITICAL
'
)
#
2019-09-12 00:40:11 Thu root DEBUG DEBUG!
#
2019-09-12 00:40:11 Thu root INFO INFO!
#
2019-09-12 00:40:11 Thu root WARNING WARNING!
#
2019-09-12 00:40:11 Thu root ERROR ERROR!
#
2019-09-12 00:40:11 Thu root CRITICAL CRITICAL
basicConfig的參數
filename: 指日志輸出目標文件的文件名
filemode: 指定日志的打開模式,默認為'a',即在filename存在的時候有效
format: 指定日志格式字符串,即指定日志輸出時所包括的字段信息以及他們的順序
datefmt: 指定日期/時間格式,該項要在format中包含時間字段%(asctime)時才有效
level: 指定日志器的日志級別
stream: 指定日志輸出目標stream,如sys.stdout、sys.stderr以及網絡stream,stream和filename不能同時提供,否則會引發ValueError異常
style: Python 3.2中新添加的配置項,指定format格式字符串的風格,可取值為'%'、'{'和'$',默認為'%'
handlers: Python 3.3中新添加的配置項,該選項如果被指定,它應該是一個創建了多個Handler的可迭代對象,這些handler將會被添加到root logger.需要說明的是:filename、stream和handlers這三個配置項只能有一個存在,不能同時出現2個或3個,否則會引發ValueError異常。
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 用戶輸出的消息
升級版日志
import
logging
LOG_FORMAT
=
'
%(asctime)s %(name)s %(levelname)s %(pathname)s %(message)s
'
#
配置日記的輸出格式
DATE_FORMAT =
'
%Y-%m-%d %H:%M:%S %a
'
#
配置時間輸出格式
logging.basicConfig(level=
logging.DEBUG,
format
=
LOG_FORMAT,
datefmt
=
DATE_FORMAT,
filename
=r
'
C:\Users\Administrator\PycharmProjects\PYL\temp_file\aaa
'
)
logging.debug(
'
DEBUG
'
)
logging.info(
'
INFO
'
)
logging.warning(
'
WARNING
'
)
logging.error(
'
ERROR
'
)
logging.critical(
'
CRITICAL
'
)
打印到文件的內容:
2019-09-12 17:12:12 Thu root DEBUG C:/Users/Administrator/PycharmProjects/PYL/temp_file/
pyfile.py DEBUG
2019-09-12 17:12:12 Thu root INFO C:/Users/Administrator/PycharmProjects/PYL/temp_file/
pyfile.py INFO
2019-09-12 17:12:12 Thu root WARNING C:/Users/Administrator/PycharmProjects/PYL/temp_file/
pyfile.py WARNING
2019-09-12 17:12:12 Thu root ERROR C:/Users/Administrator/PycharmProjects/PYL/temp_file/
pyfile.py ERROR
2019-09-12 17:12:12 Thu root CRITICAL C:/Users/Administrator/PycharmProjects/PYL/temp_file/pyfile.py CRITICAL
日志器(Logger)是有層級關系的,上面調用的logging模塊級別的函數所使用的日志器是RootLogger類的實例,其名稱為'root',它是處于日志器層級關系最頂層的日志器,且該實例是以單例模式存在的
如果要記錄的日志中包含變量數據,可使用一個格式字符串作為事件的描述消息(logging.debug、logging.info等函數的第一個參數),然后將變量數據作為第二個參數*args的值進行傳遞
logging.debug(
'
This is the %d %s log.
'
,1,
'
DEBUG
'
)
2019-09-12 17:35:54 Thu root DEBUG C:/Users/Administrator/PycharmProjects/PYL/temp_file/pyfile.py This
is
the 1 DEBUG log.
日志流處理流程
logging模塊的四大組件
1.日志器 Logger 提供了應用程序可一直使用的接口
2.處理器 Handler 將logger創建的日志記錄發送到合適的目的輸出
3.過濾器 Filter 提供了更細粒度的控制工具來決定輸出哪條日志記錄,丟棄哪條日志記錄
4.格式器 Formatter 決定日志記錄的最終輸出格式
?
組件之間的描述關系
1.logger需要通過handler將日志信息輸出到目標位置,如:文件、sys.stdout、網絡等
2.不同的logger可以將日志輸出到不同位置
3.每個handler都可以設置自己的filter實現日志過濾,從而只保留感興趣的日志?
4.每個handler都可以設置自己的filter實現同一條日志以不同的格式輸出到不同的地方
5.logger可以設置多個handler將同一條日志記錄輸出到不同的位置
即logger是入口,真正干活兒的是handler,handler還可以通過過濾器filter和formatter對要輸出的日志內容做過濾和格式化等處理操作
?
與logging四大組件相關的類:
1.Logger: 提供應用程序可直接使用的接口
2.Handler: 發送日志到適當的目的地
3.Filter: 提供了過濾日志信息的方法
4.Formatter: 指定日志顯示格式
?
logging模塊學習博客鏈接:https://www.cnblogs.com/Nicholas0707/p/9021672.html
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061
微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元

