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
更多推荐
所有评论(0)