您好,登錄后才能下訂單哦!
本文實例講述了Python實現的登錄驗證系統。分享給大家供大家參考,具體如下:
小型登錄注冊驗證系統
一、概述
使用Redis+MySQL數據庫實現一個小型的登錄注冊驗證系統。在這個系統中初步了解認識MVC框架。
具備功能:登錄、注冊、改密、注銷。
數據庫:Redis,MySQL。使用Redis把用戶信息存儲在內存中,查詢數據快。MySQL存儲空間更大,對表之間的關系管理更好。兩者結合使用發揮各自的優勢已是當下流行的數據庫使用方式。
開發語言:Python。
MVC框架:MVC全名是Model View Controller,是模型(model)-視圖(view)-控制器(controller)的縮寫,一種軟件設計典范,用一種業務邏輯、數據、界面顯示分離的方法組織代碼,將業務邏輯聚集到一個部件里面,在改進和個性化定制界面及用戶交互的同時,不需要重新編寫業務邏輯。MVC被獨特的發展起來用于映射傳統的輸入、處理和輸出功能在一個邏輯的圖形化用戶界面的結構中。
二、代碼
完整實例代碼點擊此處本站下載。
GitHub地址:https://github.com/liangdongchang/pyCheckLoginSys.git
1、Init
用來初始化服務:
①、在mysql上新建一個數據庫“homework”和建表”t_usr”
②、開啟redis服務程序
''' @author ldc ''' import os import pymysql ''' 初始化服務: 1、在mysql上新建一個數據庫“homework”和建表"t_usr" 2、開啟redis服務程序 ''' # 建立數據庫連接 conn = pymysql.connect( host='localhost', user='root', password="123456", port=3306 ) # 獲取游標 cursor = conn.cursor() # 創建數據庫 dbname = 'homework' sql=''' create database if not EXISTS %s charset=utf8; '''%dbname cursor.execute(sql) # 使用數據庫 cursor.execute('use %s'%dbname) # 創建表 sql = ''' create table if not EXISTS t_usr( id INTEGER PRIMARY KEY auto_increment, username varchar(20) unique not null, password varchar(20) not null ); ''' cursor.execute(sql) # 關閉游標與連接 cursor.close() conn.close() # 開啟redis服務,新建一個啟動redisd.bat文件, #以后開啟redis服務就可以直接打開這個文件了 def openRedisd(path): rPath = """@echo off redis-server %s pause"""%path with open(r"C:\Users\LDCPC\Desktop\啟動redisd.bat","w",encoding="ANSI") as f: f.write(rPath) openRedisd(r"D:\ruanjian\redis-64.2.8.2101\redis.windows.conf") # 打開文件“啟動redisd.bat” os.popen(r"C:\Users\LDCPC\Desktop\啟動redisd.bat")
2、View層
用來與用戶交互:接收用戶的輸入和顯示結果給用戶。
''' @author ldc ''' from controller import urls from model.model import User from utils.dbUtil import RedisUtil ''' 需求:登錄注冊驗證 1、登錄 2、注冊 3、改密 4、注銷 ''' # 主界面接口 def index(): while True: #登錄界面 print("********************************") print("* *") print("* (1) 登錄 (2)注冊 *") print("* (3) 改密 (4)注銷 *") print("* (5)退出 *") print("********************************") print() num = input("請輸入功能序號:") if num in ['1','2','3','4','5']: return num else: print("輸入有誤,請重新輸入!!!") # 輸入賬號與密碼 def inputInfo(): return input("請輸入賬號和密碼(逗號隔開):").split(',') if __name__ == '__main__': # 連接redis數據庫 RedisUtil.connect() while True: # 初始化界面 num = index() # 輸入賬號密碼 username, password = inputInfo() # 實例化一個用戶類 user = User(username, password) if num == '1': urls.login(user) #登錄 elif num == '2': urls.regist(user) # 注冊 elif num == '3': urls.changePasswd(user) # 改密 elif num == '4': urls.deleteUser(user) # 注銷 else: break
3、Controller層
實現業務邏輯,控制整個系統的實現流程。
''' @author ldc ''' from model.model import UserDao # 先查詢該用戶是否存在數據庫中 def exists(user): '''先查看Redis緩存中是否有該用戶數據''' if not UserDao.exists(user.username, 'redis'): '''然后在mysql中查詢該用戶是否存在''' if UserDao.exists(user.username, 'mysql'): # 若在mysql存在就把該用戶寫進redis, UserDao.redis.set(user.username, user.password) return 'mysql' else : return None return 'redis' ''' # 登錄模塊 先在redis上驗證,驗證成功則提示在redis上驗證成功 否則到mysql中驗證,驗證成功則提示在mysql上驗證成功 否則提示用戶不存在 ''' def login(user): print("------------登錄界面------------") # 查詢該用戶信息是否存在數據庫中 whereDB = exists(user) if whereDB == 'redis': # 匹配密碼是否正確 if UserDao.query(user, 'redis') == user.password: print("[在redis中查詢到該用戶]登錄成功!!!") return 1 else: print("[在redis中查詢到該用戶] 登錄失敗,用戶名或者密碼不正確!!!") elif whereDB == 'mysql': # 匹配密碼是否正確 if UserDao.query(user, 'mysql'): print("[在mysql中查詢到該用戶] 登錄成功!!!") return 1 else: print("[在mysql中查詢到該用戶] 登錄失敗,用戶或者密碼不正確!!!") else: print("[在mysql中查詢不到該用戶]登錄失敗,該用戶不存在,請注冊后再登錄!!!") return 0 ''' # 注冊模塊 先在redis上查詢賬號是否存在,存在則注冊失敗 否則到mysql上查詢,用戶存在則注冊失敗 否則注冊成功,把賬號寫進mysql,寫進redis ''' def regist(user): print("------------注冊界面------------") # 查詢該用戶信息是否存在數據庫中 whereDB = exists(user) if whereDB : print("注冊失敗,該用戶已存在!!!") else: if UserDao.insert(user): print("注冊成功!!!") else: print("注冊失敗!!!") ''' # 修改密碼模塊 先在redis上和mysql上查詢,用戶存在就在mysql上修改該用戶密碼, 然后把該用戶信息重新寫進redis中 在mysql中查詢不到該用戶,就返回該用戶不存在,改密失敗 ''' def changePasswd(user): print("------------改密界面------------") # 查詢該用戶信息是否存在數據庫中 whereDB = exists(user) if whereDB: user.password = input("請輸入新密碼:") if UserDao.changePasswd(user): print("改密成功!!!") else: print("改密失敗!!!") else: print("用戶不存在,改密失敗!!!") ''' # 注銷用戶模塊 先在在redis上和mysql上查詢,用戶存在就在mysql和redis上刪除該用戶 在mysql中查詢不到該用戶,就返回該用戶不存在,注銷失敗 ''' def deleteUser(user): print("------------注銷界面------------") # 查詢該用戶信息是否存在數據庫中 if login(user): if UserDao.deleteUser(user): print("注銷成功!!!") return print("注銷失敗!!!")
4、Model層
用來訪問數據庫,實現業務邏輯與數據庫分離,易于維護系統。
''' @author ldc ''' from utils.dbUtil import RedisUtil, MySQLUtil # 用戶模型類 class User: def __init__(self,username,password): self.username = username self.password = password # UserDao # 封裝了對User數據的增刪改查 # Dao=Database Access Object 數據庫訪問對象 class UserDao: # 創建數據庫對象 redis = RedisUtil() mySQL = MySQLUtil('homework','t_usr') # 執行數據庫查詢操作,返回查詢結果 @classmethod def query(cls,user,dbType): dataDict = {} dataDict["username"] = user.username dataDict["password"] = user.password if dbType == 'redis': return cls.redis.get(user.username) elif dbType == 'mysql': return cls.mySQL.query(dataDict) # 執行數據庫查詢操作,查詢用戶是否存在,返回查詢結果 @classmethod def exists(cls,username,dbType): dataDict = {} dataDict["username"] = username if dbType == 'redis': return cls.redis.exists(username) elif dbType == 'mysql': return cls.mySQL.exists(dataDict) else: pass # 執行數據插入操作,先把用戶信息添加進mysql,然后再添加進redis @classmethod def insert(cls, user): dataDict = {} dataDict["username"] = user.username dataDict["password"] = user.password if cls.mySQL.insert(dataDict): cls.redis.set(user.username,user.password) return 1 else: print("注冊失敗,服務器繁忙!!!") return 0 # 修改密碼 @classmethod def changePasswd(cls, user): dataDict = {'changeCol': 'password = %s'%user.password, 'caluse' : 'username = %s'%user.username} if cls.mySQL.update(dataDict): cls.redis.set(user.username,user.password) return 1 else: print("修改密碼失敗,服務器繁忙!!!") return 0 # 注銷用戶 @classmethod def deleteUser(cls, user): dataDict = {'username' : user.username} if cls.mySQL.delete(dataDict): cls.redis.delete(user.username) return 1 else: print("修改密碼失敗,服務器繁忙!!!") return 0
5、Utils工具包
用來實現數據庫的增刪改查,可以被不同的系統調用。
''' @author ldc ''' import pymysql import redis as redis ''' MySQL增刪改查操作類 ''' class MySQLUtil: def __init__(self,dbName,tableName): self.dbName = dbName self.tableName = tableName # 連接數據庫,并生成全局可用的連接對象和查詢游標 def connect(self): self.conn = pymysql.connect( host='localhost', user='root', password="123456", database=self.dbName, port=3306, ) self.cursor = self.conn.cursor() # 關閉全局游標,斷開全局連接 def disconnect(self): self.cursor.close() self.conn.close() # 查詢用戶名是否存在 def exists(self,dataDict): caluse = '' for key,value in dataDict.items(): caluse += key + '="'+ value + '"' # print(caluse) sql = """ select * from %s where %s ; """ % (self.tableName, caluse) return self.execute(sql) # 驗證用戶名和密碼是否正確 def query(self, dataDict): # 查詢子條件拼接 caluse = '' for key, value in dataDict.items(): caluse += key + '="' + value + '" and ' caluse = caluse[:-4] # print(caluse) sql = """ select * from %s where %s; """% (self.tableName, caluse) return self.execute(sql) # 添加新用戶 def insert(self, dataDict): # sql語句拼接 columns = '' values = '' for key, value in dataDict.items(): columns += key + ',' values += '"' + value + '",' columns = columns[:-1] values = values[:-1] sql = """ insert into %s (%s) VALUES (%s); """ % (self.tableName, columns,values) # print(sql) return self.execute(sql) # 更新 def update(self, dataDict): # sql語句拼接 changeCol = dataDict['changeCol'] #要改變值的列名 caluse = dataDict['caluse'] #要改變值的子條件 sql = 'update %s set %s where %s'%(self.tableName,changeCol,caluse) return self.execute(sql) # 刪除 def delete(self, dataDict): # sql語句拼接 caluse = '' for key,value in dataDict.items(): caluse += key + '="' + value + '"' sql = """ delete from %s where %s; """ % (self.tableName,caluse) # print(sql) return self.execute(sql) # print(sql) # 執行sql語句 def execute(self, sql): self.connect() affected = 0 try: affected = self.cursor.execute(sql) except BaseException as e: print(e) affected = 0 finally: self.conn.commit() self.disconnect() return affected ''' redis增刪改查操作類 ''' class RedisUtil: # redis連接 @classmethod def connect(cls): cls.client = redis.Redis( host='localhost', port=6379, db=1, password='123456', ) # 判斷鍵是否存在 @classmethod def exists(cls,key): return cls.client.exists(key) # 存儲鍵值, @classmethod def set(cls,key,value): # 鍵值存儲在緩存中,保留時間為30秒 cls.client.setex(key,value,30) # 獲取鍵值 @classmethod def get(cls,key): res = cls.client.get(key).decode("utf-8") return res # 刪除鍵值 def delete(cls, key): cls.client.delete(key)
6、部分功能展示
注冊:
登錄:
改密:
注銷:
更多關于Python相關內容感興趣的讀者可查看本站專題:《Python面向對象程序設計入門與進階教程》、《Python數據結構與算法教程》、《Python函數使用技巧總結》、《Python字符串操作技巧匯總》、《Python編碼操作技巧總結》及《Python入門與進階經典教程》
希望本文所述對大家Python程序設計有所幫助。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。