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


Posted in Python onApril 12, 2019

本文实例讲述了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实现的登录验证系统完整案例【基于搭建的MVC框架】

登录:

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

改密:

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

注销:

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

希望本文所述对大家Python程序设计有所帮助。

Python 相关文章推荐
Python实现多线程抓取妹子图
Aug 08 Python
Python 正则表达式入门(中级篇)
Dec 07 Python
python分析作业提交情况
Nov 22 Python
python编写微信远程控制电脑的程序
Jan 05 Python
tensorflow学习笔记之mnist的卷积神经网络实例
Apr 15 Python
python之django母板页面的使用
Jul 03 Python
Django2.1.3 中间件使用详解
Nov 26 Python
Win10下python 2.7与python 3.7双环境安装教程图解
Oct 12 Python
Python Django模板之模板过滤器与自定义模板过滤器示例
Oct 18 Python
pytorch方法测试——激活函数(ReLU)详解
Jan 15 Python
Python参数传递及收集机制原理解析
Jun 05 Python
Python实现列表索引批量删除的5种方法
Nov 16 Python
Python实现的银行系统模拟程序完整案例
Apr 12 #Python
详解python--模拟轮盘抽奖游戏
Apr 12 #Python
Python实现的排列组合、破解密码算法示例
Apr 12 #Python
Opencv-Python图像透视变换cv2.warpPerspective的示例
Apr 11 #Python
Opencv+Python实现图像运动模糊和高斯模糊的示例
Apr 11 #Python
详解python执行shell脚本创建用户及相关操作
Apr 11 #Python
python中aioysql(异步操作MySQL)的方法
Apr 11 #Python
You might like
php checkdate、getdate等日期时间函数操作详解
2010/03/11 PHP
php中3种方法删除字符串中间的空格
2014/03/10 PHP
PHP闭包函数传参及使用外部变量的方法
2016/03/15 PHP
php+lottery.js实现九宫格抽奖功能
2019/07/21 PHP
Prototype中dom对象方法汇总
2008/09/17 Javascript
javascript 构建一个xmlhttp对象池合理创建和使用xmlhttp对象
2010/01/15 Javascript
jquery 操作DOM案例代码分享
2012/04/05 Javascript
密码强度检测效果实现原理与代码
2013/01/04 Javascript
使用javascript为网页增加夜间模式
2014/01/26 Javascript
JS辨别访问浏览器判断是android还是ios系统
2014/08/19 Javascript
一个JavaScript递归实现反转数组字符串的实例
2014/10/14 Javascript
javascript中的遍历for in 以及with的用法
2014/12/22 Javascript
AngularJs 指令详解及示例代码
2016/09/01 Javascript
AngularJs  Creating Services详解及示例代码
2016/09/02 Javascript
JS实现针对给定时间的倒计时功能示例
2017/04/11 Javascript
layer插件select选中默认值的方法
2018/08/14 Javascript
Node.js API详解之 querystring用法实例分析
2020/04/29 Javascript
[43:36]Liquid vs Mineski 2018国际邀请赛小组赛BO2 第一场 8.18
2018/08/19 DOTA
Python 分析Nginx访问日志并保存到MySQL数据库实例
2014/03/13 Python
关于python pyqt5安装失败问题的解决方法
2017/08/08 Python
OpenCV-Python实现轮廓检测实例分析
2018/01/05 Python
使用Django简单编写一个XSS平台的方法步骤
2019/03/25 Python
python使用ctypes调用扩展模块的实例方法
2020/01/28 Python
python爬虫 requests-html的使用
2020/11/30 Python
CSS3实现跳动的动画效果
2016/09/12 HTML / CSS
详解Html5 监听拦截Android返回键方法
2018/04/18 HTML / CSS
Glamest意大利:女性在线奢侈品零售店
2019/04/28 全球购物
美国知名眼镜网站:Target Optical
2020/04/04 全球购物
Nike瑞士官网:Nike CH
2021/01/18 全球购物
打架检讨书400字
2014/01/17 职场文书
聊城大学毕业生自荐书
2014/02/01 职场文书
乡镇干部先进性教育活动个人整改措施
2014/09/16 职场文书
2015年优质护理服务工作总结
2015/04/08 职场文书
《珍珠鸟》教学反思
2016/02/16 职场文书
go 实现简易端口扫描的示例
2021/05/22 Golang
vue-cil之axios的二次封装与proxy反向代理使用说明
2022/04/07 Vue.js