使用Python實現簡易的用戶登錄驗證功能

互聯架構唠唠嗑 2024-06-01 10:21:35

這篇文章將向你展示如何使用Python語言進行程序設計,實現一個簡易的用戶登錄驗證功能。

該功能允許用戶輸入由字母和數字任意組合而成的用戶名和密碼,並通過while循環不斷地提示用戶輸入,直到憑證正確爲止。所有憑證信息將被存儲在一個字典中,以便進行匹配驗證。

另外,引入了驗證碼機制,要求用戶輸入一個由0至9隨機組成的四位數。無論登錄嘗試成功與否,此程序都會立即給出反饋,確保用戶能夠及時了解自己的登錄狀態。

用戶登錄驗證的邏輯流程圖

源碼import random# 數據庫模擬,字典存放用戶信息users_db = { "user-a": "123password", "user-b": "456password", "user-c": "789password"}# 該字典用于存放各個用戶登錄密碼錯誤的次數login_count = {}def generate_captcha(): """生成四位數字的驗證碼""" return str(random.randint(1000, 9999))"""# 生成四位數驗證碼的另一種思路def generate_verification_code(): return ''.join([str(random.randint(0, 9)) for _ in range(4)])"""def verify_captcha(captcha_input, captcha_actual): """驗證用戶輸入的驗證碼是否正確""" return captcha_input == captcha_actualdef user_login(): while True: """輸入用戶登錄信息""" username = input("請輸入用戶名:") password = input("請輸入密碼:") # 生成驗證碼 captcha = generate_captcha() print(f"驗證碼是:{captcha}") captcha_input = input("請輸入驗證碼:") # 用戶名驗證 if username in users_db: # 驗證碼驗證 if not verify_captcha(captcha_input, captcha): print("驗證碼錯誤!") continue # 密碼驗證 if users_db[username] == password: print("登錄成功!") break # 登錄成功,退出循環 else:# 密碼錯誤次數記錄與鎖定賬號 if username in login_count: login_count[username] += 1 else: login_count[username] = 1 if login_count[username] >= 3: print("密碼錯誤次數過多,賬號已被鎖定!") break # 輸錯三次密碼,鎖定賬號,退出循環 else: print("密碼錯誤!請重新輸入!") else: print("用戶名不存在,請重新輸入!")if __name__ == "__main__": user_login()運行結果

代碼分析

一、字典存放用戶信息

字典是一種可變的容器模型,且可存儲任意類型對象,用 { } 標識。字典是一個無序的鍵(key)值(value)對的集合。類似于,json對象存儲格式

dic = {keyl = valuel, key2 = value2}

二、驗證碼生成函數

def generate_captcha(): """生成四位數字的驗證碼""" return str(random.randint(1000, 9999))

該函數的目的是生成一個四位數字的驗證碼。這個驗證碼是由隨機生成的四位數組成,範圍從1000到9999。

具體來說,代碼的工作流程如下:

random.randint(1000, 9999):這行代碼使用 random 模塊的 randint 函數來生成一個位于1000和9999之間的隨機整數,包括1000和9999。這意味著生成的驗證碼將是一個四位數。str(...):這個函數將生成的整數轉換成字符串形式。因爲驗證碼通常需要是字符串格式。# 生成四位數驗證碼的另一種思路def generate_verification_code(): return ''.join([str(random.randint(0, 9)) for _ in range(4)])

這個函數generate_verification_code的目的是生成一個四位數的隨機驗證碼。這個驗證碼由0到9的數字組成,每個數字都是隨機選擇的。

讓我們分解這個函數來看它是如何工作的:

random.randint(0, 9):這個表達式會生成一個0到9(包括0和9)之間的隨機整數。random是Python的標准庫中的一個模塊,它提供了生成隨機數的函數。randint是random模塊中的一個函數,用于生成一個指定範圍內的隨機整數。[str(random.randint(0, 9)) for _ in range(4)]:這是一個列表推導式,它將執行四次random.randint(0, 9)操作,生成四個隨機數字。str()函數用于將每個生成的數字轉換爲字符串,因爲我們需要的是字符串形式的數字,以便稍後可以連接成一個四位的字符串。''join(...):join是字符串的一個方法,它將列表中的所有元素連接成一個單一的字符串。在這個例子中,它將四個隨機生成的字符串數字連接成一個四位的字符串。

每次調用generate_verification_code函數時,它都會返回一個不同的四位隨機驗證碼字符串。這個驗證碼可以用作登錄驗證的一部分,以確保嘗試登錄的用戶是人類而不是自動化腳本。

三、格式化字符串字面量

在Python中,f-string是一種字符串字面量,它允許在字符串中嵌入表達式,並使用大括號{}來引用變量或者表達式。這種方式在Python 3.6及以上版本中可用,是一種非常方便和簡潔的字符串格式化方法。

# 生成驗證碼captcha = generate_captcha()print(f"驗證碼是:{captcha}")captcha_input = input("請輸入驗證碼:")

這行代碼print(f"驗證碼:{verification_code}")的作用是將變量verification_code的值嵌入到字符串中,並將其打印出來。這裏的f表示這是一個格式化字符串,而{verification_code}告訴Python在這個位置插入verification_code變量的值。

當這行代碼執行時,它會生成一個包含隨機生成的驗證碼的字符串,並輸出到控制台。

四、"main"函數與程序入口

對于很多編程語言來說,程序都必須要有一個入口,比如C,C++,以及完全面向對象的編程語言Java,C#等。

如果你接觸過這些語言,對于程序入口這個概念應該很好理解,C,C++都需要有一個main函數作爲程序的入口,也就是程序的運行會從main函數開始。同樣,Java,C#必須要有一個包含Main方法的主類,作爲程序入口。

而Python則不同,它屬于解釋型腳本語言,不像編譯型語言那樣先將程序編譯成二進制再運行,而是動態的逐行解釋運行。也就是從腳本第一行開始運行,沒有統一的入口。

一個Python源碼文件(.py)除了可以被直接運行外,還可以作爲模塊(也就是庫),被其他.py文件導入。不管是直接運行還是被導入,.py文件的最頂層代碼都會被運行(Python用縮進來區分代碼層次),而當一個.py文件作爲模塊被導入時,我們可能不希望一部分代碼被運行。

所以,在Python中,if __name__ == "__main__":是一個常見的結構,用于確定模塊是被直接運行還是被導入到另一個模塊中。這裏的__name__是Python的一個內置變量,它代表了當前模塊的名稱。

當一個模塊被直接運行時,__name__的值會被設置爲"__main__"。當一個模塊被導入到另一個模塊中時,__name__的值會被設置爲該模塊的名稱。

因此,if __name__ == "__main__":塊中的代碼只有在模塊被直接運行時才會執行。這通常用于定義主程序入口點,即當模塊作爲腳本運行時應該執行的操作。

if __name__ == "__main__": user_login()

這段代碼意味著如果這個模塊是作爲主程序運行的,那麽user_login()函數將被調用。這通常用于編寫可複用的代碼,既可以作爲庫導入到其他項目中,也可以作爲獨立的腳本運行。

例如,假設有一個名爲my_module.py的文件,內容如下:

def user_login(): print("User logged in!")if __name__ == "__main__": user_login()

如果直接運行my_module.py,輸出將會是:

User logged in!

但如果在其他模塊中導入my_module,user_login()函數不會被自動調用:

import my_module# 這不會打印 "User logged in!",因爲 my_module 被導入而不是直接運行

這種結構是Python中常見的程序入口點定義方式,它允許模塊的行爲根據其是被直接運行還是被導入而有所不同。

作者:陳熙matoeffe鏈接:https://juejin.cn/post/7374055681890795555

1 阅读:34

互聯架構唠唠嗑

簡介:感謝大家的關注