1. 程式人生 > 其它 >常用模組講解(三)

常用模組講解(三)

常用模組講解(三)

hashlib加密模組

  1. 什麼是加密?

    就是將明文(人能看得懂的)資料通過一些手段變成密文資料(人看不懂的),密文資料的表現形式一般都是一串沒有規則的字串。

  2. 加密演算法

    加密演算法有很多種,加密演算法就是將明文變密文的內部規則,加密演算法的難易程度可以根據產生密文的長短來判斷,越長意味著演算法越複雜。

  3. 加密使用場景

    涉及到隱私資料的時候,就會考慮加密,最為常見的就是對使用者的密碼加密,防止密碼洩露。使用者輸入的還是明文但是到了程式裡面之後會採用相同的加密演算法變成密文,之後拿著密文與跟資料庫裡面的密文比對如果一致就是密碼正確不一致就是錯誤。

  4. md5演算法

    md5演算法是最為常見的加密演算法,可以滿足一般的業務需求了。

import hashlib
md5 = hashlib.md5()  # 指定演算法
# 將明文資料傳遞給演算法物件
md5.update(b'hello')  # 只能接收bytes型別
res = md5.hexdigest()  # 獲取加密之後的密文
print(res)  # 5d41402abc4b2a76b9719d911017c59

在傳入資料的時候,只要內容一致,那麼演算法的結果肯定一致

md5 = hashlib.md5()
# md5.update(b'asd')
# md5.update(b'hello')
# md5.update(b'oscar')
# print(md5.hexdigest())  # 7e2574e7470e97d6221d6159c348c68c
md5.update(b'asdhellooscar')
print(md5.hexdigest())  # 7e2574e7470e97d6221d6159c348c68c
  1. 加密之後的結果是無法直接反解密的

    所謂的反解密就是靠反覆的猜,也就是暴力解密,網上有這些解密的操作,本質就是自己寫了很多不同的的資料,然後進行加密,之後把資料和對應的密文儲存在資料庫中,我們去解密的時候就是進行一一比對。

  2. 加鹽處理

# 增加破解難度
md5 = hashlib.md5()
md5.update('你幹嘛'.encode('utf8'))  # 加鹽處理,就是新增一些額外的干擾項
md5.update(b'oscar')
print(md5.hexdigest())  # 4ce3e71a6a31b22e504b3cc8acde95d6
# 還可以動態加鹽,就是干擾項變成動態的,比如時間等等

logging模組

  1. 日誌等級

import logging
# 日誌按照重要程度分為五個級別:預設只有達到warning警告級別及以上才會記錄日誌
logging.debug('debug message')
logging.info('info message')
logging.warning('warning message')
logging.error('error message')
logging.critical('critical message')
  1. 基本使用

# 當程式執行完之後你會發現自動建立了一個a11.log檔案,裡面記錄了我們的一些操作
file_logging = logging.FileHandler(filename='a11.log',mode='a',encoding='utf8')
logging.basicConfig(format='%(asctime)s - %(name)s - %(levelname)s -%(module)s:  %(message)s',
      datefmt='%Y-%m-%d %H:%M:%S %p',handlers = [file_logging],level = logging.ERROR)
logging.error('記錄一下')

購物車

	# 專案功能
  	1.使用者註冊
    2.使用者登入
    3.新增購物車
    4.結算購物車
  # 專案說明
  	使用者資料採用json格式儲存到檔案目錄db下 一個使用者一個單獨的檔案
    	資料格式 {"name":"jason","pwd":123} 
      # ps:檔名可以直接用使用者名稱便於校驗
    使用者註冊時給每個使用者新增兩個預設的鍵值對(賬戶餘額 購物車)
    	{"balance":15000,"shop_car":{}}
    新增購物車功能 商品列表可以自定義或者採用下列格式
    	good_list = [
        		['掛壁面',3]
        		['印度飛餅', 22]
            ['極品木瓜', 666], 
            ['土耳其土豆', 999],  
            ['伊拉克拌麵', 1000],  
            ['董卓戲張飛公仔', 2000],  
            ['開天闢地', 10000] 
        ]
      使用者可以反覆新增商品,在購物車中記錄數量
      		{'極品木瓜':[個數,單價]}
    結算購物車
    	獲取使用者購物車中所有的商品計算總價並結算即可
  # 思考:針對新增購物車和結算只有登入的使用者才可以執行如何實現
import os
import json
res = os.path.dirname(__file__)  # 動態獲取路徑
res_db = os.path.join(res, r'db')  # 拼接路徑
if not os.path.exists(res_db):  # 判斷路徑是否存在
    os.mkdir(r'db')  # 不存在則建立檔案

name_dict = {}

def func_all():
    while True:
        print('''
        1.註冊
        2.登入
        3.新增購物車
        4.清空購物車
        5.退出
        ''')
        chooes = input('你想幹嘛>>:').strip()
        if chooes == '1':
            register()
        elif chooes == '2':
            login()
        elif chooes == '3':
            apptend_car()
        elif chooes == '4':
            clear_car()
        elif chooes == '5':
            return
        else:
            print('暫未開放')

is_login = {'username': None}  # 定義一個全域性變數,用於驗證使用者是否登入

def outer(func_name):  # 驗證使用者是否登入的裝飾器
    def inner(*args, **kwargs):
        if is_login.get('username'):  # 如果is_login.get('username')不是空值,證明登入成功
            func_name(*args, **kwargs)
        else:
            print('請先登入')
            login()  # 否則先登入
    return inner

def register():
    username = input('名字>>:').strip()
    passward = input('密碼>>:').strip()
    name_dict = {'username': username,
                 'password': passward,
                 'balance': 15000,
                 'shop_car': {}}
    res_db_username = os.path.join(res_db, fr'{username}.json')  # 拼接路徑
    if not os.path.exists(res_db_username):  # 判斷路徑是否存在,等於判斷使用者名稱是否存在
        with open(res_db_username,'w',encoding='utf8') as f:  #不存在使用文字操作的w模式進行建立並寫入資訊
            json.dump(name_dict,f)  # 序列化轉為json格式
            print(f'使用者{username}註冊成功')
    else:
        print(f'使用者{username}已存在')


def login():
    username = input('名字>>:').strip()
    passward = input('密碼>>:').strip()
    res_db_username = os.path.join(res_db, fr'{username}.json')  # 拼接路徑
    if not os.path.exists(res_db_username):  # 判斷路徑是否存在,等於判斷使用者名稱是否存在
        print('對不起使用者名稱不存在或錯誤')
    else:
        with open(res_db_username,'r',encoding='utf8') as f:  # 如果存在,則使用只讀模式開啟檔案
            login_dict = json.load(f)  # 反序列化,轉為相對應的Python資料型別
        if login_dict['password'] == passward:  # 校驗密碼是否正確
            print('登入成功')
            is_login['username'] = username  # 如果登入成功,改變全域性變數is_login的v值
        else:
            print('密碼錯誤')

good_list = [
        	['掛壁面',3],
        	['印度飛餅', 22],
            ['極品木瓜', 666],
            ['土耳其土豆', 999],
            ['伊拉克拌麵', 1000],
            ['董卓戲張飛公仔', 2000],
            ['模擬玩偶', 10000]
        ]
@outer  # 語法糖
def apptend_car():
    shop_car_dict = {}  # 定義一個臨時字典
    while True:
        for a,b in enumerate(good_list,start=1):  # 利用列舉,列舉出所有商品的資訊和編號
            print('''商品編號:%s---商品名稱:%s---商品單價:%s'''% (a,b[0],b[1]))
        chooes_buy = input('你想買啥,(y退出)>>:').strip()  # 獲取使用者的操作
        if chooes_buy == 'y':  # 輸入y直接退出
            return
        if chooes_buy.isdigit():  # 如果不是y,判斷是否是純數字
            chooes_buy = int(chooes_buy)  # 轉換型別,轉為整型
            if chooes_buy in range(1,len(good_list) + 1):  # 判斷使用者輸入的編號是否屬於商品編號
                chooes_buy_name = good_list[chooes_buy - 1][0]  # 獲取商品名稱
                chooes_buy_pice = good_list[chooes_buy - 1][1]  # 獲取商品單價
            buy_number = input('你想買多少份>>:').strip()  # 獲取使用者想要買的數量
            if buy_number.isdigit():  # 判斷是否是純數字
                buy_number = int(buy_number)  # 轉換型別,轉為整型
            if chooes_buy_name not in shop_car_dict.keys():  # 判斷商品名稱是否在臨時字典的k值中
                shop_car_dict[chooes_buy_name] = [buy_number,chooes_buy_pice]  # 如果不在,就作為k值,v值是一個列表,列表中的元素是購買的數量和商品單價
            else:
                shop_car_dict[chooes_buy_name][0] += buy_number  # 如果商品名稱是否在臨時字典的k值中,那就取出v值,利用下標索引來修改購買的數量
        else:
            print('請輸入正確的商品編號')
            continue
        # name_dict['shop_car'] = shop_car_dict
        res_db_username = os.path.join(res_db, '%s.json'% is_login.get('username'))  # 拼接路徑,第二個引數就是已經登入的使用者檔案
        with open(res_db_username,'r',encoding='utf8') as f:  # 利用只讀模式開啟改檔案
            car_dict = json.load(f)  # 反序列化,轉為相對應的Python資料型別,並用變數名接收
        # car_dict['shop_car'] = shop_car_dict
        real_car_dict = car_dict['shop_car']  # 用一個變數名來接收取出來的car_dict['shop_car'],也就是購物車的字典
        for shop_name in shop_car_dict:  # for迴圈臨時字典
            if shop_name in real_car_dict:  # 判斷臨時字典中的k值是否在購物車的字典
                real_car_dict[shop_name][0] += shop_car_dict[shop_name][0]  # 如果在,就把購物車的字典中該k值對應的v值中的商品個數加上臨時字典中該k值對應的v值的中商品個數
            else:
                real_car_dict[shop_name] = shop_car_dict[shop_name]  # 如果不存在,新增新的鍵值對
        car_dict['shop_car'] = real_car_dict  # 把舊的購物車字典進行更新
        with open(res_db_username,'w',encoding='utf8') as f1:  # 利用只寫模式開啟檔案
            json.dump(car_dict,f1,ensure_ascii=False)  # 序列化寫入檔案,第三個引數是顯示json格式中的中文
@outer
def clear_car():
    sum_all = 0  # 定義一個變數
    res_db_username = os.path.join(res_db, '%s.json' % is_login.get('username'))  # 拼接路徑,第二個引數就是已經登入的使用者檔案
    with open(res_db_username, 'r', encoding='utf8') as f:  # 利用只讀模式開啟改檔案
        car_dict = json.load(f)  # 反序列化,轉為相對應的Python資料型別,並用變數名接收
        car_dict_values = car_dict['shop_car'].values()  # 定義一個變數名來接收購物車字典的v值
    for a,b in car_dict_values:  # 解壓賦值
        sum_all += a * b  # 算出總消費
    if sum_all < car_dict['balance']:  # 判斷餘額與總消費的的大小
        balance_money = car_dict['balance'] - sum_all  # 減去消費之後的餘額
        car_dict['balance'] = balance_money  # 對餘額進行更新
        car_dict['shop_car'] = {}  # 清空購物車
        with open(res_db_username, 'w', encoding='utf8') as f1:  # 利用只寫模式開啟檔案
            json.dump(car_dict,f1)  # 序列化寫入檔案
        print(f'結算成功,你的餘額為{balance_money}')
    else:
        print('你的餘額不足')

func_all()  # 呼叫函式,開始執行

這裡是IT小白陸祿緋,歡迎各位大佬的指點!!!