Python权限校验装饰器与logging模块的实战应用
1. 权限校验装饰器的设计与实现在Web开发或API服务中权限校验是保障系统安全的重要环节。Python的装饰器Decorator为权限校验提供了一种优雅、非侵入式的实现方式。1.1 基础权限校验装饰器下面是一个简单的权限校验装饰器示例用于检查用户是否具有特定角色from functools import wraps def require_role(required_role): 权限校验装饰器检查用户是否具有指定角色 def decorator(func): wraps(func) def wrapper(*args, **kwargs): # 模拟从请求上下文中获取用户信息 user_role get_current_user_role() if user_role ! required_role: raise PermissionError(f需要 {required_role} 权限当前用户角色{user_role}) return func(*args, **kwargs) return wrapper return decorator 使用示例 require_role(admin) def delete_user(user_id): 删除用户仅管理员可操作 print(f正在删除用户 {user_id}) return True 模拟获取当前用户角色的函数 def get_current_user_role(): 实际项目中可能从session、token或数据库中获取 return user # 模拟普通用户1.2 多权限校验装饰器实际项目中一个操作可能需要多个权限。下面展示支持多个权限的装饰器def require_permissions(*required_perms): 权限校验装饰器检查用户是否具有所有指定权限 def decorator(func): wraps(func) def wrapper(*args, **kwargs): user_perms get_current_user_permissions() missing_perms [perm for perm in required_perms if perm not in user_perms] if missing_perms: raise PermissionError(f缺少权限{, .join(missing_perms)}) return func(*args, **kwargs) return wrapper return decorator 使用示例 require_permissions(user:read, user:write) def update_user_profile(user_id, profile_data): 更新用户资料需要读写权限 print(f更新用户 {user_id} 的资料) return True def get_current_user_permissions(): 模拟用户权限列表 return [user:read, config:view]2. logging模块的配置与使用Python的logging模块是标准库中功能强大的日志记录工具合理配置可以大幅提升调试和运维效率。2.1 基础日志配置以下是logging模块的基本配置和使用方式# 类实例对象的使用 # 设置初级级别为最小让其他对象日志级别可用 # logging.basicConfig(levellogging.DEBUG) # 设置日志对象实例设置初始的级别 logger logging.getLogger(__name__) logger.setLevel(logging.DEBUG) # 设置流式处理器实例对象 shander logging.StreamHandler() # 设置级别 shander.setLevel(logging.ERROR) # 设置标准格式 formater logging.Formatter(%(asctime)s - %(name)s - %(levelname)s - %(message)s) # 添加固定格式到处理器的实例对象中 shander.setFormatter(formater) # 添加处理器到日志实例对象中 logger.addHandler(shander) # 设置文件处理器对象操作 fhander logging.FileHandler(test.log) fhander.setLevel(logging.INFO) fhander.setFormatter(formater) logger.addHandler(fhander) # 用创建出来的logger实例对象来 logger.debug(debug12) logger.info(info2332) logger.warning(warning423) logger.error(error432) logger.critical(critical432)
