python登录系统的实现方法_python实现登录验证系统(搭建MVC框架)

小型登录注册验证系统

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

一、概述

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

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

​ 数据库:Redis,MySQL。使用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、部分功能展示

注册:

70

登录:

70

改密:

70

注销:

70

后记

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

也可加我微信【1257309054】,拉你进群,大家一起交流学习。

如果文章对您有帮助,请我喝杯咖啡吧!

公众号

20200317124808234.jpg

watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2xtX2lzX2Rj,size_16,color_FFFFFF,t_70

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

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值