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自动化测试之连接几组测试包实例
Sep 28 Python
初步介绍Python中的pydoc模块和distutils模块
Apr 13 Python
WINDOWS 同时安装 python2 python3 后 pip 错误的解决方法
Mar 16 Python
python3 拼接字符串的7种方法
Sep 12 Python
Python标准库使用OrderedDict类的实例讲解
Feb 14 Python
解决Django中调用keras的模型出现的问题
Aug 07 Python
在Python中画图(基于Jupyter notebook的魔法函数)
Oct 28 Python
python matplotlib 画dataframe的时间序列图实例
Nov 20 Python
python之MSE、MAE、RMSE的使用
Feb 24 Python
python使用openpyxl操作excel的方法步骤
May 28 Python
Pytorch实验常用代码段汇总
Nov 19 Python
python字典的元素访问实例详解
Jul 21 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在各种web服务器的运行模式详解
2013/06/03 PHP
PHP中执行MYSQL事务解决数据写入不完整等情况
2014/01/07 PHP
Codeigniter操作数据库表的优化写法总结
2014/06/12 PHP
Zend Framework教程之配置文件application.ini解析
2016/03/10 PHP
PHP长网址与短网址的实现方法
2017/10/13 PHP
php设计模式之中介者模式分析【星际争霸游戏案例】
2020/03/23 PHP
网页中的图片的处理方法与代码
2009/11/26 Javascript
JavaScript学习笔记(十七)js 优化
2010/02/04 Javascript
Jquery替换已存在于element上的event的方法
2010/03/09 Javascript
Asp.net下使用Jquery Ajax传送和接收DataTable的代码
2010/09/12 Javascript
用XMLDOM和ADODB.Stream实现base64编码解码实现代码
2010/11/28 Javascript
获取内联和链接中的样式(js代码)
2013/04/11 Javascript
jQuery Ajax异步处理Json数据详解
2013/11/05 Javascript
js中substring和substr的定义和用法
2014/05/05 Javascript
jQuery.prop() 使用详解
2015/07/19 Javascript
分享Javascript实用方法二
2015/12/13 Javascript
js获取浏览器高度 窗口高度 元素尺寸 偏移属性的方法
2016/11/21 Javascript
提高JavaScript执行效率的23个实用技巧
2017/03/01 Javascript
js css3实现图片拖拽效果
2017/03/04 Javascript
Angular.js中下拉框实现渲染html的方法
2017/06/18 Javascript
AngularJS service之select下拉菜单效果
2017/07/28 Javascript
一种angular的方法级的缓存注解(装饰器)
2018/03/13 Javascript
使用Vuex实现一个笔记应用的方法
2018/03/13 Javascript
vue实现自定义多选与单选的答题功能
2018/07/05 Javascript
layui问题之模拟select点击事件的实例讲解
2018/08/15 Javascript
vue实现Input输入框模糊查询方法
2021/01/29 Javascript
跟老齐学Python之Python文档
2014/10/10 Python
Python的组合模式与责任链模式编程示例
2016/02/02 Python
python 剪切移动文件的实现代码
2018/08/02 Python
Python3.5面向对象程序设计之类的继承和多态详解
2019/04/24 Python
对python 中re.sub,replace(),strip()的区别详解
2019/07/22 Python
python属于解释型语言么
2020/06/15 Python
matplotlib subplot绘制多个子图的方法示例
2020/07/28 Python
三星法国官方网站:Samsung法国
2019/10/31 全球购物
医学生自我鉴定范文
2013/11/08 职场文书
学生个人自我鉴定
2014/03/26 职场文书