本文实例讲述了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服务程序
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
|
''' @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层
用来与用户交互:接收用户的输入和显示结果给用户。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
|
''' @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层
实现业务逻辑,控制整个系统的实现流程。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
|
''' @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层
用来访问数据库,实现业务逻辑与数据库分离,易于维护系统。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
|
''' @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工具包
用来实现数据库的增删改查,可以被不同的系统调用。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
|
''' @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程序设计有所帮助。
原文链接:https://blog.csdn.net/lm_is_dc/article/details/80342510