侯体宗的博客
  • 首页
  • 人生(杂谈)
  • 技术
  • 关于我
  • 更多分类
    • 文件下载
    • 文字修仙
    • 中国象棋ai
    • 群聊
    • 九宫格抽奖
    • 拼图
    • 消消乐
    • 相册

Python实现的登录验证系统完整案例【基于搭建的MVC框架】

Python  /  管理员 发布于 7年前   171

本文实例讲述了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 osimport 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;  '''%dbnamecursor.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 urlsfrom model.model import Userfrom 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 pymysqlimport 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程序设计有所帮助。


  • 上一条:
    Python面向对象思想与应用入门教程【类与对象】
    下一条:
    Python实现的银行系统模拟程序完整案例
  • 昵称:

    邮箱:

    0条评论 (评论内容有缓存机制,请悉知!)
    最新最热
    • 分类目录
    • 人生(杂谈)
    • 技术
    • linux
    • Java
    • php
    • 框架(架构)
    • 前端
    • ThinkPHP
    • 数据库
    • 微信(小程序)
    • Laravel
    • Redis
    • Docker
    • Go
    • swoole
    • Windows
    • Python
    • 苹果(mac/ios)
    • 相关文章
    • 在python语言中Flask框架的学习及简单功能示例(0个评论)
    • 在Python语言中实现GUI全屏倒计时代码示例(0个评论)
    • Python + zipfile库实现zip文件解压自动化脚本示例(0个评论)
    • python爬虫BeautifulSoup快速抓取网站图片(1个评论)
    • vscode 配置 python3开发环境的方法(0个评论)
    • 近期文章
    • 在go语言中实现字符串可逆性压缩及解压缩功能(0个评论)
    • 使用go + gin + jwt + qrcode实现网站生成登录二维码在app中扫码登录功能(0个评论)
    • 在windows10中升级go版本至1.24后LiteIDE的Ctrl+左击无法跳转问题解决方案(0个评论)
    • 智能合约Solidity学习CryptoZombie第四课:僵尸作战系统(0个评论)
    • 智能合约Solidity学习CryptoZombie第三课:组建僵尸军队(高级Solidity理论)(0个评论)
    • 智能合约Solidity学习CryptoZombie第二课:让你的僵尸猎食(0个评论)
    • 智能合约Solidity学习CryptoZombie第一课:生成一只你的僵尸(0个评论)
    • 在go中实现一个常用的先进先出的缓存淘汰算法示例代码(0个评论)
    • 在go+gin中使用"github.com/skip2/go-qrcode"实现url转二维码功能(0个评论)
    • 在go语言中使用api.geonames.org接口实现根据国际邮政编码获取地址信息功能(1个评论)
    • 近期评论
    • 122 在

      学历:一种延缓就业设计,生活需求下的权衡之选中评论 工作几年后,报名考研了,到现在还没认真学习备考,迷茫中。作为一名北漂互联网打工人..
    • 123 在

      Clash for Windows作者删库跑路了,github已404中评论 按理说只要你在国内,所有的流量进出都在监控范围内,不管你怎么隐藏也没用,想搞你分..
    • 原梓番博客 在

      在Laravel框架中使用模型Model分表最简单的方法中评论 好久好久都没看友情链接申请了,今天刚看,已经添加。..
    • 博主 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 @1111老铁这个不行了,可以看看近期评论的其他文章..
    • 1111 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 网站不能打开,博主百忙中能否发个APP下载链接,佛跳墙或极光..
    • 2016-10
    • 2016-11
    • 2018-04
    • 2020-03
    • 2020-04
    • 2020-05
    • 2020-06
    • 2022-01
    • 2023-07
    • 2023-10
    Top

    Copyright·© 2019 侯体宗版权所有· 粤ICP备20027696号 PHP交流群

    侯体宗的博客