python3和Redis数据库以及mysql数据库实现注册、登录

6 篇文章 0 订阅
5 篇文章 0 订阅
# 输入用户名、密码
# 密码加密
# 判断redis中是否记录了用户名,如果有则成功(redis只会记录一条name数据)
# 如果redis中没有用户名,则到mysql中查询
# 从mysql中查询成功后,将用户名记录到redis中
#!/usr/bin/env python
# coding=utf-8
# 业务过程如下:
# 输入用户名、密码
# 密码加密
# 判断redis中是否记录了用户名,如果有则成功
# 如果redis中没有用户名,则到mysql中查询
# 从mysql中查询成功后,将用户名记录到redis中

from MysqlHelper import MysqlHelper
from hashlib import sha1
from RedisHelper import RedisHelper

class ManageSystem():
    def main(self):
        while True:
            print("==============XXXXX管理系统==============")
            key = input("请输入相应功能数字代码(1/注册、2/登录、0/退出):")
            if key == "1":
                print("=============欢迎注册=============")
                self.register()
            elif key == "2":
                print("=============欢迎登录=============")
                self.login()
            elif key == "0":
                print("程序已退出,谢谢使用!")
                exit()
            else:
                print("输入有误,请重新输入!")
    # 加密功能
    def encryption(self,pwd):
        self.s1 = sha1()
        self.s1.update(pwd.encode())
        return self.s1.hexdigest()
    # 定义连接数据库功能
    def db_connect(self):
        return MysqlHelper(host="localhost",port=3306,user="root",passwd="123456",
                                    db="python3",charset="utf8")
    # 定义连接Redis数据库功能
    def redis_connect(self):
        return RedisHelper(host='localhost',port=6379)
    # 注册功能
    def register(self):
        register_name = input("请输入注册名(不含空格或者回车):")
        # 不能让用户输入回车、空格
        if " " in register_name or len(register_name)== 0:
            print("用户名中含空格或回车,注册失败,请重新输入!")
            self.register()
        else:
            # 判断用户名是否存在
            sql_select = "select name from userinfos"
            # 连接数据库
            conn = self.db_connect()
            # 使用MysqlHelper的all方法,获取结果
            result = conn.all(sql_select)
            # 存储数据库中姓名字段的列表
            name_list = []
            for i in range(len(result)):
                name_list.append(result[i][0])
            if register_name in name_list:
                print("抱歉该用户名'%s'已被使用,请重新注册!"%register_name)
                self.register()
            else:
                while True:
                    # 将来还需要对密码进行正则判断,比如6-8位,数字、下划线、字母组成
                    register_passwd = input("请输入密码:")
                    # 不能让用户输入回车、空格
                    if " " in register_passwd or len(register_passwd) == 0 :
                        print("密码中含空格或回车,注册失败,请重新输入!")
                    else:
                        # 对密码进行加密
                        pwd_register = self.encryption(register_passwd)
                        # 写入数据库userinfos中
                        sql_insert = "insert into userinfos(name,passwd)VALUES(%s,%s)"
                        conn = self.db_connect()
                        msg = ("'%s'用户名已注册成功!"%register_name)
                        conn.cud(sql_insert,[register_name,pwd_register],msg)
                        break
    # 登录功能
    def login(self,count=0):
        if count <3:
            login_name = input("请输入用户名:")
            login_passwd = input("请输入密码:")
            # 对密码进行加密
            pwd_login = self.encryption(login_passwd)
            # 去Redis里面先查询
            redis = self.redis_connect()
            if redis.get('name') == login_name:
                print("恭喜,Redis数据库中有此用户%s!"%login_name)
                exit()
            else:
                print("Redis数据库没有存储此名字,去mysql里面查询!")
                sql = "select passwd from userinfos WHERE name=%s"
                conn = self.db_connect()
                result = conn.all(sql,[login_name])
                # 判断处理
                if len(result) == 0:
                    print("sorry,没有此用户名!")
                    count += 1
                    self.login(count)
                elif result[0][0] == pwd_login:
                    redis.set('name',login_name)
                    print("用户'%s'登录成功!"%login_name)
                    exit()
                else:
                    print("密码错误!")
                    count += 1
                    self.login(count)
        else:
            print("连续错误三次,请重新选择!")

if __name__ == "__main__":
    manage = ManageSystem()
    manage.main()

MysqlHelper.py模块:

#!/usr/bin/env python
# coding=utf-8
# mysql封装使用
import pymysql

class MysqlHelper():
    def __init__(self,host,port,db,user,passwd,charset='utf8'):
        self.host = host
        self.port = port
        self.db = db
        self.user = user
        self.password = passwd
        self.charset = charset
    def open(self):
        # 连接数据库
        self.conn = pymysql.connect(host=self.host,port=self.port,db=self.db,
                                    user=self.user,passwd=self.password,charset=self.charset)
        # 创建游标对象
        self.cursor = self.conn.cursor()
    # 关闭
    def close(self):
        self.cursor.close()
        self.conn.close()

    # 增加、修改、删除命令语句
    def cud(self,sql,params,msg="操作成功"):
        try:
            self.open()
            # 处理逻辑数据,传入sql语句以及参数化
            self.cursor.execute(sql,params)
            # 执行事务
            self.conn.commit()
            self.close()
            # 这样可以修改输出的操作成功信息提示
            print(msg)
        except Exception as e:
            self.conn.rollback()
            print("错误",e)
    # 查询所有数据,多个值
    def all(self,sql,params=()):
        try:
            self.open()
            self.cursor.execute(sql,params)
            data = self.cursor.fetchall()
            self.close()
            return data
        except Exception as e:
            print("错误", e)

RedisHelper.py模块:

#!/usr/bin/env python
# coding=utf-8
# redis封装使用
import redis

class RedisHelper():
    def __init__(self,host,port=6379):
        self.host = host
        self.port = port
        # decode_responses如果不写的话默认为False,这样会导致结果是二进制数据,不是字符串
        self._redis = redis.StrictRedis(self.host,self.port,decode_responses=True)
    def get(self,key):
        if self._redis.exists(key):
            return self._redis.get(key)
        else:
            return ""
    def set(self,key,value):
        self._redis.set(key,value)
if __name__ == '__main__':
    redis = RedisHelper(host='localhost')
    redis.set('hello','word')
    print(redis.get('hello'))

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值