当前位置: 首页 > news >正文

Python进阶必备:装饰器与日志模块实战解析

一、权限校验装饰器

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
http://www.jsqmd.com/news/1298276/

相关文章:

  • 谷歌预热新手机,相机栏发光球体或叫 Pixel Glow,用途成谜!
  • Windows 操作系统 - 符号链接
  • 小升初数学思维提升训练:94集视频课程与PDF教材全解析
  • 龍魂·五行计算器 v3.0 | CNSH中文编程
  • 联发科手机救砖全攻略:从BROM模式到SP Flash Tool实战
  • 焕新:苏州物联网芯片烧录解决方案源头厂家 - 品牌推广大师
  • Windows C++进程终结:从PID、句柄到进程名的完整实现方案
  • Mozilla 浏览器新标签页再更新:新增每日一换的迷你填字游戏小部件
  • 基于TPS5430的24V转8V/2A开关电源设计全解析
  • 功能开发插件的智能代理架构
  • 赛马训练中身高差对人马协作的影响与优化策略
  • SpringBoot整合MyBatisPlus启动报错解决方案
  • 无刷直流电机原理、控制与应用全解析:从FOC算法到无人机选型
  • 后端接口挂了,前端怎么继续干活?这个 Chrome 扩展让我再也没等过后端
  • 终极内存补丁技术:深度解析RevokeMsgPatcher跨平台消息保留解决方案
  • 浏览器网络请求控制神器:Header Editor 终极免费指南
  • 计算机体系结构期末高效复习指南:从流水线到Cache的核心攻坚
  • FPGA学习路线全解析:从硬件思维到算法加速的实战指南
  • 获客智能体怎么变现?订阅、贴牌、项目制和代运营怎么选
  • Java垃圾回收机制与性能优化实战
  • 游戏性能优化实战:解决GC频繁触发导致的帧率卡顿问题
  • 钣金设计高薪进阶:从材料工艺到DFMA降本增效全解析
  • 响应式编程中的数据消费者:Subscriber 的角色与本质
  • 如何用Sunshine打造个人云游戏服务器:免费开源的终极指南
  • 光纤通信四波混频效应MATLAB仿真实现
  • 2026 年阿合奇诚信的多联机中央空调安装定做厂家推荐,选它居然省了小半万?空调安装的那些你不知道的省钱门道-博力久能暖通工程 - 企业官方推荐【认证】
  • PyTorch核心架构与深度学习框架设计解析
  • SSH连接linux之>linux用户管理
  • STM32串口通信实战:CH340驱动安装、硬件连接与程序下载全攻略
  • API幂等性测试实战:从原理到并发与事务一致性验证