一、权限校验装饰器
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