香港云主机最佳企业级服务商!

ADSL拨号VPS包含了中国大陆(联通,移动,电信,)

中国香港,国外拨号VPS。

当前位置:云主机 > python >

电信ADSL拨号VPS
联通ADSL拨号VPS
移动ADSL拨号VPS

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


时间:2022-04-02 10:28 作者:admin


本文实例讲述了python/' target='_blank'>python实现的登录验证系统。分享给大家供大家参考,具体如下:

小型登录注册验证系统

一、概述

​ 使用Redis+mysql/' target='_blank'>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程序设计有所帮助。

(责任编辑:admin)






帮助中心
会员注册
找回密码
新闻中心
快捷通道
域名登录面板
虚机登录面板
云主机登录面板
关于我们
关于我们
联系我们
联系方式

售前咨询:17830004266(重庆移动)

企业QQ:383546523

《中华人民共和国工业和信息化部》 编号:ICP备00012341号

Copyright © 2002 -2018 香港云主机 版权所有
声明:香港云主机品牌标志、品牌吉祥物均已注册商标,版权所有,窃用必究

云官方微信

在线客服

  • 企业QQ: 点击这里给我发消息
  • 技术支持:383546523

  • 公司总台电话:17830004266(重庆移动)
  • 售前咨询热线:17830004266(重庆移动)