小型登录注册验证系统

关注公众号“轻松学编程”了解更多。

一、概述

​ 使用Redis+MySQL数据库实现一个小型的登录注册验证系统。在这个系统中初步了解认识MVC框架

​ 具备功能:登录、注册、改密、注销。

​ 数据库:RedisMySQL。使用Redis把用户信息存储在内存中,查询数据快。MySQL存储空间更大,对表之间的关系管理更好。两者结合使用发挥各自的优势已是当下流行的数据库使用方式。

​ 开发语言:Python

​ MVC框架:MVC全名是Model View Controller,是模型(model)-视图(view)-控制器(controller)的缩写,一种软件设计典范,用一种业务逻辑、数据、界面显示分离的方法组织代码,将业务逻辑聚集到一个部件里面,在改进和个性化定制界面及用户交互的同时,不需要重新编写业务逻辑。MVC被独特的发展起来用于映射传统的输入、处理和输出功能在一个逻辑的图形化用户界面的结构中。

二、代码

云盘:源码链接:https://pan.baidu.com/s/184igcfqY6JcaA5oR_7Ypbg 密码:rja6
GitHub:https://github.com/liangdongchang/pyCheckLoginSys.git

1、Init

用来初始化服务:

1、在mysql上新建一个数据库“homework”和建表"t_usr"

2、开启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、部分功能展示

注册:

登录:

改密:

注销:

后记

【后记】为了让大家能够轻松学编程,我创建了一个公众号【轻松学编程】,里面有让你快速学会编程的文章,当然也有一些干货提高你的编程水平,也有一些编程项目适合做一些课程设计等课题。

也可加我微信【1257309054】,拉你进群,大家一起交流学习。
如果文章对您有帮助,请我喝杯咖啡吧!

公众号

关注我,我们一起成长~~

python实现登录验证系统(搭建MVC框架)的更多相关文章

  1. 洗礼灵魂,修炼python(81)--全栈项目实战篇(9)—— 购物商城登录验证系统

    都在线购物过吧?那么你应该体验过,当没有登录账户时,点开购物车,个人中心,收藏物品等的操作时,都会直接跳转到登录账户的界面,然后如果登录一次后就不用再登录,直到用户登出. 是的,本次项目就是做一个登录 ...

  2. VS2017创建一个 ASP.NET Core2.0 应用,并搭建 MVC 框架

    https://testerhome.com/topics/11747 1.使用最新版本的VS2017,并安装.NET Core2.0中相关开发工具   2.打开VS2017,点击文件-新建-项目,选 ...

  3. 【ASP.NET Core】- 搭建MVC框架

    1.使用最新版本的VS2017,并安装.NET Core2.0中相关开发工具   2.打开VS2017,点击文件-新建-项目,选择.NET Core中的ASP.NET Core Web 应用程序   ...

  4. php小程序-文章发布系统(mvc框架)

    php小程序-文章发布系统(mvc框架) 一 项目视图 二 项目经验 通过对mvc微型框架的实现,对mvc理论加深,有利于以后框架的学习 三 项目源码 http://files.cnblogs.com ...

  5. 基于web公交查询系统---搭建mvc连接数据库(我的毕业设计,进度继续)

    建立一个spring的项目:我在已经做过的项目基础下做的,所以接口连接数据库挺快. 搭建好的.对应好数据库: 前几天进度已经完成简单的设计: 完成登录,用户管理(修改删除). 继续的数据库的信息获取, ...

  6. 一个简单的python登录验证系统

      希望大家来指正一下,之前间断学习了很久,刚捡起来继续学习,下面的代码写的不太好,希望看到的大神能够给予指正. 修正版: 1 # python_zhangzengqiang 2 3 a = open ...

  7. 【疑问】用python写登录验证遇到的问题

    最近开始断断续续学习python,今天加入博客园,作为新人,和各位老师们讨教了,以后多多照顾!为了大家能看清楚所以就截图了,文末尾附源码,说不定会有那位老师给我指教一番.############### ...

  8. 如何搭建MVC + EF 框架

    1.搭建MVC框架 1.1 VS2010:需要安装WPI 安装 ASP.NET MVC 4 和Visual Studio 2010 系统必备组件 如果上述链接无法打开,请访问:http://www.a ...

  9. MVC框架实例构建

    转自:http://www.cnblogs.com/levenyes/p/3290885.html MVC全名是Model View Controller,是模型(model)-视图(view)-控制 ...

随机推荐

  1. Python-统计序列中元素

    问题1: 随机数列[12,5,8,7,8,9,4,8,5,...] 中出现次数最高的3个元素,他们出现的次数 问题2: 对某英文文章的单词,进行词频统计,找出出现次数最搞得10个单词,他们出现的次数是 ...

  2. 详解SVM模型——核函数是怎么回事

    大家好,欢迎大家阅读周二机器学习专题,今天的这篇文章依然会讲SVM模型. 也许大家可能已经看腻了SVM模型了,觉得我是不是写不出新花样来,翻来覆去地炒冷饭.实际上也的确没什么新花样了,不出意外的话这是 ...

  3. 使用 jsDelivr 免费加速 GitHub Pages 博客的静态资源(二)

    之前写过一篇 使用 jsDelivr 免费加速 GitHub Pages 博客的静态资源,在那之后,又陆续想到并实施了几点利用 jsDelivr 进一步加速静态资源加载的措施,新起一篇作为记录和分享. ...

  4. error C2065: “uint8_t”: 未声明的标识符

    转载:https://blog.csdn.net/lys07962000/article/details/12052571 参考: http://blog.csdn.net/chenxin_130/a ...

  5. matlab中figure 创建图窗窗口

    来源:https://ww2.mathworks.cn/help/matlab/ref/figure.html?searchHighlight=figure&s_tid=doc_srchtit ...

  6. Git本地已有项目关联远程仓库

    情况: 本地已有项目 远程有个仓库 目的: 本地项目关联远程仓库 首先要把本地项目变成git管理的,也就是建立一个本地仓库,可以在项目目录下面使用git init命令初始化仓库,初始化成功之后会在仓库 ...

  7. 拜托,别再问我怎么自学 Java 了!和盘托出

    假如有那么残酷的一天,我不小心喝错了一瓶药,一下子抹掉了我这十多年的编程经验,把我变成了一只小白.我想自学 Java,并且想要找到一份工作,我预计需要 6 个月的时间,前提条件是每天都处于高效率的学习 ...

  8. Linux桌面环境配置

    目录 更换软件源 中文输入法 firefox安装flash插件 编译安装Vim 关闭蓝牙开机自启 yakuake无法正常使用 在中文环境下将默认目录修改成英文 电脑换成了thinkpad x1c 20 ...

  9. GDB将所有线程堆栈输出到文件

    在调试多线程程序时,经常需要查看线程堆栈信息,如果线程数目过多,每次查看一个线程堆栈,繁琐耗时.下面介绍一种一次性将所有线程堆栈输出到文件的方法. 首先,将gdb attach到调试线程 gdb -p ...

  10. day08 Pyhton学习

    一.昨日内容回顾 .1.基础部分的补充 join()  把列表变成字符串, 拼接 split() 切割 删除: 列表和字典不能在循环的时候进行删除. 把要删除的内容记录在一个新列表中,然后循环新列表, ...