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