基于装饰器的用户管理登录

简介

使用装饰器登录用户。

示例

LOGIN_USER = {"is_login": False}


def wrapper(func):
    def inner(*args, **kwargs):
        if LOGIN_USER['is_login']:
            ret = func()
            return ret
        else:
            print("请登录!")
    return inner

@wrapper
def check_roder():
    pass

@wrapper
def chang_pwd():
    pass

@wrapper
def manager():
    print("欢迎 %s 归来!" % (LOGIN_USER['current_user']))


def login(user, pwd):
    with open("database", "r", encoding='utf-8') as f:
        user_list = []
        for line in f:
            line_str = line.strip().split("|")
            user_list.append(line_str[0])
            if line_str[0] == user and line_str[1] == pwd:
                print("验证成功,正在登录.......")
                LOGIN_USER["is_login"] = True
                LOGIN_USER["current_user"] = user
                manager()
                return 1
        if user not in user_list:
            print("账户名不存在!")
            return 0
        return -1


def main():
    flag = True
    while flag:
        command = input("1、后台管理;2、登录")
        if command == "1":
            manager()
        elif command == "2":
            user = input("请输入用户名:")
            pwd = input("请输入密码:")
            ret = login(user, pwd)
            if ret == -1:
                print("密码错误!")
            elif ret == 1:
                flag = False


if __name__ == '__main__':
    main()

结果:
这里写图片描述

进阶篇(一)

管理要求:
要求:
1、必须使用装饰器,对普通用户和管理员用户的权限进行限定;
2、必须从文件中读取用户名和密码;
3、实现增、删、改、查等的功能;
这里写图片描述
代码:
首先创建Tool.py文件用于存放函数:

'''
@author: XT
'''
# -*- coding:utf-8 -*-
def check_info(email, telephone, rank):
    """
    检查输入的信息格式是否正确
    :param email:
    :param telephone:
    :param rank:
    :return:
    """
    if "@" not in email:
        print("邮箱不合法!")
        return False
    elif len(telephone) != 11:
        print("手机号码不合法!")
        return False
    elif rank not in ("1", "2"):
        print("没有该等级!")
        return False
    return True

def get_username():
    """
    获得用户名列表
    :return:
    """
    with open("database", 'r', encoding='utf-8')as f:
        user_list = []
        for line in f:
            line_str = line.split("|")
            user_list.append(line_str[0])
    return user_list


def add_userinfo(username, password, email, telephone, rank):
    """
    在原文件上追加用户信息
    :param username:
    :param password:
    :param email:
    :param telephone:
    :param rank:
    :return:
    """
    with open("database", 'a', encoding='utf-8')as f:
        f.write("\n{name}|{pwd}|{em}|{tel}|{r}".format(name=username, pwd=password,
                                                       em=email, tel=telephone, r=rank))

def register(username, password, email, telephone, rank):
    """
    注册新用户信息
    :param username:
    :param password:
    :param email:
    :param telephone:
    :param rank:
    :return:
    """
    user_list = get_username()
    if username in user_list:
        print("用户名已存在!请重新创建...")
        return False
    elif "@" not in email:
        print("邮箱不合法!")
        return False
    elif len(telephone) != 11:
        print("手机号码不合法!")
        return False
    elif rank not in ("1", "2"):
        print("没有该等级!")
        return False
    else:
        add_userinfo(username, password, email, telephone, rank)
        return True


def chang_info(info_list):
    """
    管理员修改用户信息
    :param info_list: 
    :return: 
    """
    username, password, email, telephone, rank = info_list
    with open("database", 'r', encoding='utf-8')as f, open("database_new", 'w', encoding='utf-8')as f_new:
        for line in f:
            if line.strip().split("|")[0] == username:
                print("正在修改......")
                f_new.write(
                    "{name}|{pwd}|{em}|{tel}|{r}\n".format(name=username, pwd=password,em=email,tel=telephone,r=rank))
                continue
            f_new.write(line)
    print("修改到新文件database_new")




其次,新建主函数文件test.py

import Tool

LOGIN_USER = {"is_login": False}


def wrapper_login(func):
    def inner(*args, **kwargs):
        if LOGIN_USER.get('is_login',None):
            ret = func(*args, **kwargs)
            return ret
        else:
            print("请登录!")

    return inner


def wrapper_priority(func):
    def inner(*args, **kwargs):
        if LOGIN_USER.get('current_rank',None) == "2":
            ret = func(*args, **kwargs)
            return ret
        else:
            print("对不起!你没有权限!")
            exit()

    return inner


@wrapper_login
@wrapper_priority
def delet_userinfo(username):
    with open("database", 'r', encoding='utf-8')as f, open("database_new", 'w', encoding='utf-8')as f_new:
        for line in f:
            line_str = line.strip().split("|")
            if line_str[0] == username:
                print("正在删除:%s" % line)
                continue
            f_new.write(line)
    print("修改到新文件database_new")


@wrapper_login
def print_info():
    print("用户名:{}  密码:{}  邮箱:{}  手机号:{}  用户类型:{}".format(LOGIN_USER["current_user"],
                                                         LOGIN_USER["current_pwd"], LOGIN_USER["current_email"],
                                                         LOGIN_USER["current_telephone"],
                                                         "普通用户" if LOGIN_USER["current_rank"] == "1" else "管理员用户"))


@wrapper_login
@wrapper_priority
def manager_checkinfo(check_name):
    user_list = Tool.get_username()
    while check_name not in user_list:
        check_name = input("用户名不存在,请重新输入用户名:")
    else:
        info_list = manager(check_name)
        for item in info_list:
            print("用户名:{}  密码:{}  邮箱:{}  手机号:{}  用户类型:{}".format(item[0], item[1],
                                                                 item[2], item[3],
                                                                 "普通用户" if item[4] == "1" else "管理员用户"))
        return info_list


@wrapper_login
def chang_pwd():
    old_pwd = input("请输入原密码:")
    while old_pwd != LOGIN_USER["current_pwd"]:
        print("原密码错误!请重新输入:")
        old_pwd = input("请输入原密码:")
    else:
        new_pwd1 = input("请输入新密码:")
        new_pwd2 = input("请再次输入密码:")
        while new_pwd1 != new_pwd2:
            print("两次输入的密码不一样!")
            new_pwd1 = input("请输入新密码:")
            new_pwd2 = input("请再次输入密码:")
        else:
            with open("database", 'r', encoding='utf-8')as f, open("database_new", 'w', encoding='utf-8')as f_new:
                for line in f:
                    if line.strip().split("|")[0] == LOGIN_USER["current_user"]:
                        print("正在修改......")
                        f_new.write(
                            "{name}|{pwd}|{em}|{tel}|{r}\n".format(name=LOGIN_USER["current_user"], pwd=new_pwd2,
                                                                   em=LOGIN_USER["current_email"],
                                                                   tel=LOGIN_USER["current_telephone"],
                                                                   r=LOGIN_USER["current_rank"]))
                        continue
                    f_new.write(line)
            print("修改到新文件database_new")


@wrapper_login
@wrapper_priority
def manager(arg):
    with open("database", 'r', encoding='utf-8')as f:
        info_list = []
        for line in f:
            line_str = line.strip().split("|")
            if arg in line_str:
                info_list.append(line_str)
        return info_list


@wrapper_login
@wrapper_priority
def manage_email(arg):
    """
    查找邮箱
    :param arg:
    :return:
    """
    with open("database", 'r', encoding='utf-8')as f:
        info_list = []
        for line in f:
            line_str = line.strip().split("|")
            if arg in line_str[2]:
                info_list.append(line_str)
        return info_list


def login(user, pwd):
    with open("database", "r", encoding='utf-8') as f:
        user_list = []
        for line in f:
            line_str = line.strip().split("|")
            user_list.append(line_str[0])
            if line_str[0] == user and line_str[1] == pwd:
                print("验证成功,正在登录.......")
                LOGIN_USER["is_login"] = True
                LOGIN_USER["current_user"] = user
                LOGIN_USER["current_pwd"] = pwd
                LOGIN_USER["current_email"] = line_str[2]
                LOGIN_USER["current_telephone"] = line_str[3]
                LOGIN_USER["current_rank"] = line_str[-1]
                print("欢迎 %s 归来!" % (LOGIN_USER['current_user']))
                return 1
        if user not in user_list:
            print("账户名不存在!")
            return 0
        return -1


def main():
    flag = True
    while flag:
        command = input("1、后台管理;2、登录;3、注册新用户\n>>")
        if command == "1":
            arg = input("要查询的模糊信息:")
            manager(arg)
        elif command == "2":
            user = input("请输入用户名:")
            pwd = input("请输入密码:")
            ret = login(user, pwd)
            if ret == -1:
                print("密码错误!")
            elif ret == 1:
                flag = False
                comop = input("要选择的操作:\n1、后台管理;\n2、查看个人信息;\n3、修改密码\n4、删除用户\n"
                              "5、查看用户信息\n6、修改用户信息\n7、模糊查找邮箱信息\n8、退出\n>>")
                while comop != "8":
                    if comop == "1":
                        arg = input("要查询的模糊信息:")
                        manager(arg)
                    elif comop == "2":
                        print_info()
                    elif comop == "3":
                        chang_pwd()
                    elif comop == "4":
                        delet_name = input("要删除的用户名:")
                        user_list = Tool.get_username()
                        while delet_name not in user_list:
                            print("没有此用户!")
                            delet_name = input("请再次输入要删除的用户名:")
                        else:
                            delet_userinfo(delet_name)
                    elif comop == "5":
                        check_name = input("要查询的用户名:")
                        manager_checkinfo(check_name)
                    elif comop == "6":
                        check_name = input("要修改的用户名:")
                        info_list = manager_checkinfo(check_name)
                        info_list = info_list[0]#列表中的列表
                        print("修改前: ", info_list)
                        index_list = ["用户名", "密码", "邮箱", "手机号", "用户类型"]
                        index = input("要修改的地方:0、%s;1、%s;2、%s;3、%s;4、%s" % (index_list[0], index_list[1],
                                                                           index_list[2], index_list[3], index_list[4]))
                        while int(index) not in (range(5)):
                            index = input("参数范围在:0、%s;1、%s;2、%s;3、%s;4、%s" % (index_list[0], index_list[1],
                                                                              index_list[2], index_list[3],
                                                                              index_list[4]))
                        else:
                            check_info_flag = False
                            while not check_info_flag:
                                change_content = input("\033[41;1m 修改的%s内容为:\033[0m" % (index_list[int(index)]))
                                info_list[int(index)] = change_content
                                check_info_flag = Tool.check_info(info_list[2], info_list[3], info_list[4])
                            else:
                                print("修改后: ", info_list)
                                Tool.chang_info(info_list)
                    elif comop == "7":
                        arg = input("请输入模糊的邮箱信息:")
                        info_list = manage_email(arg)
                        for item in info_list:
                            print("用户名:{}  密码:{}  邮箱:{}  手机号:{}  用户类型:{}".format(item[0],
                                                                                 item[1], item[2], item[3],
                                                                                 "普通用户" if item[4] == "1" else "管理员用户"))
                    comop = input(">>下一步要选择的操作:\n1、后台管理;\n2、查看个人信息;\n3、修改密码\n4、删除用户\n"
                                  "5、查看用户信息\n6、修改用户信息\n7、模糊查找邮箱信息\n8、退出\n>>")

        elif command == "3":
            user = input("请输入注册用户名:")
            pwd = input("请输入注册密码:")
            email = input("请输入邮箱:")
            telephone = input("请输入手机号:")
            rank = input("请选择用户类型:1、普通用户;2、管理员用户")
            register_result = Tool.register(user, pwd, email, telephone, rank)
            if register_result:
                print("注册成功!")
                flag = False
            else:
                print("注册失败!")


if __name__ == '__main__':
    main()

数据库内容为:

Admin|123456|Ad123@yahoo.com|17723498012|2
Alex|123|Alex666@gmail.com|13723498012|2
AlexTim|111|Tim888@email.com|17723498012|2
Kevin|999|Kevin278@gmail.com|13523498012|1
Daisy|888888|Dy368@gmail.com|15723498012|1
Jason|666|JS@126.com|12276543689|1
David|12389|Daivd999@126.com|13876432789|1
Nancy|16542|Nancy193@163.com|19823280428|1

非管理员示例:
这里写图片描述

管理员示例:
这里写图片描述
这里写图片描述

登录与查看个人信息示例:
这里写图片描述

修改密码示例:
这里写图片描述

修改邮箱示例:
这里写图片描述

模糊邮箱信息查找示例:
这里写图片描述

查看用户信息示例:
这里写图片描述

修改用户类型示例:
这里写图片描述
修改后:
这里写图片描述

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
以下是一个基于 Flask 框架的 Python 代码模板,包含了 Token 验证、用户登录和权限管理功能: ```python from flask import Flask, jsonify, request, g import jwt from functools import wraps app = Flask(__name__) # 配置密钥 app.config['SECRET_KEY'] = 'your_secret_key_here' # 用户数据 users = [ {'id': 1, 'username': 'user1', 'password': 'password1', 'role': 'admin'}, {'id': 2, 'username': 'user2', 'password': 'password2', 'role': 'user'}, ] # Token 验证装饰 def token_required(f): @wraps(f) def decorated(*args, **kwargs): token = request.headers.get('Authorization') if not token: return jsonify({'message': 'Token is missing!'}), 401 try: data = jwt.decode(token, app.config['SECRET_KEY']) g.current_user = [user for user in users if user['id'] == data['id']][0] except: return jsonify({'message': 'Token is invalid!'}), 401 return f(*args, **kwargs) return decorated # 用户登录路由 @app.route('/login', methods=['POST']) def login(): auth = request.authorization if not auth or not auth.username or not auth.password: return jsonify({'message': 'Could not verify login information!'}), 401 user = [user for user in users if user['username'] == auth.username and user['password'] == auth.password] if not user: return jsonify({'message': 'Could not verify login information!'}), 401 token = jwt.encode({'id': user[0]['id']}, app.config['SECRET_KEY']) return jsonify({'token': token.decode('UTF-8')}) # 需要管理员权限的路由 @app.route('/admin', methods=['GET']) @token_required def admin_only(): if g.current_user['role'] != 'admin': return jsonify({'message': 'Admin permission required!'}), 401 return jsonify({'message': 'Welcome, admin!'}) # 需要用户权限的路由 @app.route('/user', methods=['GET']) @token_required def user_only(): if g.current_user['role'] != 'user': return jsonify({'message': 'User permission required!'}), 401 return jsonify({'message': 'Welcome, user!'}) if __name__ == '__main__': app.run(debug=True) ``` 以上代码实现了 Token 验证、用户登录和权限管理功能。其中: - `token_required` 装饰用于需要 Token 验证的路由,确保只有带有有效 Token 的请求才能通过。 - `login` 路由用于用户登录,验证用户信息并返回 Token。 - `/admin` 和 `/user` 路由分别需要管理员和普通用户权限,通过 `g.current_user` 获取当前用户信息,判断用户角色是否具有访问权限。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

何以问天涯

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值