一、权限校验装饰器

1. 装饰器本质

装饰器本质是闭包 + 语法糖(@),在不修改原函数代码的前提下,为其附加新功能。

2. 登录校验案例

from functools import wraps

user = None

def login_required(func):
    @wraps(func)  # 保留原函数的元信息(__name__、__doc__等)
    def check_login():
        global user
        if user:
            func()
        else:
            name = input("输入用户名:")
            pwd = input("输入密码:")
            if name == "admin" and pwd == "123456":
                user = name
                func()
            else:
                print("用户名或密码错误")
    return check_login

@login_required
def center():
    """个人中心页面"""
    print("欢迎来到个人中心")

3. 关键点

@wraps(func) 保证装饰后的函数名、文档字符串不丢失

通过 global user 在闭包中修改外部变量

支持多个函数共用同一套校验逻辑


二、Logging日志模块

1. 日志级别(由低到高)

级别 用途
DEBUG 调试信息
INFO 常规信息
WARNING 警告信息
ERROR 错误信息
CRITICAL 致命错误

2. 基础配置方式

import logging

logging.basicConfig(
    level=logging.DEBUG,
    format='%(asctime)s - %(name)s - %(levelname)s - %(message)s',
    handlers=[
        logging.StreamHandler(),  # 输出到控制台
        logging.FileHandler("app.log")  # 输出到文件
    ]
)

logging.info("程序启动成功")

3. 进阶:多处理器 + 自定义格式

import logging

# 创建Logger实例
logger = logging.getLogger(__name__)
logger.setLevel(logging.DEBUG)

# 控制台处理器(INFO级别)
sh = logging.StreamHandler()
sh.setLevel(logging.INFO)
sh.setFormatter(logging.Formatter('%(asctime)s - %(levelname)s - %(message)s'))
logger.addHandler(sh)

# 文件处理器(WARNING级别)
fh = logging.FileHandler('error.log')
fh.setLevel(logging.WARNING)
fh.setFormatter(logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s'))
logger.addHandler(fh)

logger.debug("调试信息")   # 仅文件(因为文件级别为WARNING,所以不会记录)
logger.warning("警告信息") # 控制台 + 文件

三、两者结合:带日志的权限装饰器

import logging
from functools import wraps

logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s')

user = None

def login_required(func):
    @wraps(func)
    def wrapper(*args, **kwargs):
        global user
        if user:
            logging.info(f"用户 {user} 访问 {func.__name__}")
            return func(*args, **kwargs)
        else:
            logging.warning("未登录用户尝试访问受保护页面")
            # ... 登录逻辑
    return wrapper

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐