Python 权限装饰器与日志模块:给函数穿防护马甲 + 让程序写日记
文章目录 前言第一部分权限装饰器 —— 给函数“穿防护马甲”1.1 权限装饰器 —— 未登录有效保护1.2 怎么调用装饰器1.3 wraps(func) 是干嘛的1.4 装饰器核心总结第二部分logging 日志模块 —— 让程序学会“写日记”2.1 为什么要用日志2.2 日志的五个级别从低到高2.3 基础用法 —— 按你图中的代码来2.4 图解日志是怎么流动的2.5 多个日志实例独立模块2.6 日志格式占位符说明2.7 日志模块核心总结 结尾 前言在 Python 编程中我们常常会遇到一些看似简单却非常实用的技巧它们能极大提升代码的可维护性和安全性。今天不讲复杂的概念就聊两件特别实用的事第一件权限装饰器—— 这是一种优雅的设计模式它允许你在不改变函数本身代码的情况下为函数“穿上防护马甲”添加额外的功能。想象一下你有一个需要登录才能访问的个人中心页面传统做法是在每个函数开头都加上登录检查的代码这样不仅重复还容易出错。而装饰器可以让你用一行login_required就搞定所有需要权限验证的函数代码简洁又安全。第二件日志模块—— 这是程序“写日记”的能力。在开发阶段我们习惯用print()来调试但当程序部署到服务器上后你不可能一直盯着屏幕看输出。日志模块让程序能够自动把运行过程中的关键信息如错误、警告、用户操作等记录到文件中。当程序出现问题时你可以像查案一样翻阅日志文件快速定位问题根源这比靠眼睛盯着屏幕找错误靠谱一万倍。这两件事虽然基础但却是 Python 开发中不可或缺的实用技能。本文将按照清晰的思路分开讲解这两个主题每个部分都配有详细的代码示例和流程图确保你不仅能理解原理还能立即上手应用到自己的项目中。让我们开始吧第一部分权限装饰器 —— 给函数“穿防护马甲”1.1 权限装饰器 —— 未登录有效保护pythonfrom functools import wraps user None # 全局变量记录当前登录用户默认没人 def login_required(func): wraps(func) # 保留原函数的名字和注释方便调试 def check_login(): check_login 注释说明 global user if user: # 已经登录了 → 直接执行原函数 func() else: # 没登录 → 让用户输入账号密码 user_name input(输入用户名) password input(输入密码) if user_name admin and password 123456: user user_name func() else: print(用户名或者密码错误) return check_login这段代码的执行逻辑text调用被装饰的函数 ↓ 检查 user 是否为空 ↓ ┌────┴────┐ ↓ ↓ user 有值 user 是 None 已登录 未登录 ↓ ↓ 直接执行 让你输账号密码 原函数 ↓ ┌───┴───┐ ↓ ↓ 正确 错误 ↓ ↓ 登录成功 提示错误 ↓ 执行原函数1.2 怎么调用装饰器python# 普通函数不用登录就能看 def index(): print(欢迎来到首页) 加了 login_required 的函数必须先登录才能进 login_required def center(): center 是个人中心 print(欢迎来到个人中心) login_required def wallet(): print(欢迎来到钱包页面) 调用 index() # 直接输出欢迎来到首页 center() # 没登录的话会让你输账号密码 wallet() # 登录过一次之后后面的函数直接放行运行效果第一次调用center()text输入用户名admin 输入密码123456 欢迎来到个人中心第二次调用wallet()已登录不用再输text欢迎来到钱包页面1.3wraps(func)是干嘛的不加wraps(func)你的函数名字会被“偷换”掉python# 不加 wraps def login_required(func): def check_login(): pass return check_login login_required def center(): 我是个人中心 pass print(center.name) # check_login ← 函数名变了加了wraps(func)之后pythonfrom functools import wraps def login_required(func): wraps(func) def check_login(): pass return check_login login_required def center(): 我是个人中心 pass print(center.name) # center ← 还是原来的名字 一句话wraps的作用就是“把原函数的身份信息名字、注释等复制给包装函数”方便调试和查错。1.4 装饰器核心总结概念说明本质闭包 语法糖作用不改变原函数给函数加新功能wraps保住原函数的名字和注释global user在函数里修改全局变量login_required执行函数前先校验是否登录第二部分logging日志模块 —— 让程序学会“写日记”2.1 为什么要用日志写代码的时候你习惯用print()来调试。但程序跑在服务器上之后你不可能一直盯着屏幕看。这时候就需要日志——程序自己把运行信息写进文件里出问题了你去翻文件就能查到。日志的作用场景说明排查错误程序崩了翻日志看哪里出了问题监控运行看程序在什么时间干了什么事记录关键操作谁在什么时候删了什么数据2.2 日志的五个级别从低到高级别函数啥时候用DEBUGlogger.debug()调试信息最详细INFOlogger.info()常规运行信息WARNINGlogger.warning()警告不影响运行ERRORlogger.error()出错了但程序还能跑CRITICALlogger.critical()严重错误程序要挂了级别规则设置了setLevel(logging.WARNING)就只会记录WARNING及以上级别WARNING、ERROR、CRITICALDEBUG和INFO就不显示了。2.3 基础用法 —— 按你图中的代码来pythonimport logging 1. 创建日志实例 logger logging.getLogger(name) # name 是当前模块名 logger.setLevel(logging.DEBUG) # 设置级别覆盖默认的 WARNING 2. 创建控制台处理器输出到屏幕 stream_handler logging.StreamHandler() stream_handler.setLevel(logging.INFO) # 控制台只显示 INFO 及以上 设置控制台输出格式 stream_formatter logging.Formatter(%(asctime)s - %(name)s - %(levelname)s - %(message)s) stream_handler.setFormatter(stream_formatter) 把处理器添加到日志实例 logger.addHandler(stream_handler) 3. 创建文件处理器输出到文件 file_handler logging.FileHandler(log.txt) file_handler.setLevel(logging.WARNING) # 文件只记录 WARNING 及以上 设置文件输出格式 file_formatter logging.Formatter(%(asctime)s - %(name)s - %(levelname)s - %(message)s) file_handler.setFormatter(file_formatter) 把处理器添加到日志实例 logger.addHandler(file_handler) 4. 输出日志 logger.debug(debug 信息) # 只有控制台显示因为控制台是 INFO会显示 DEBUG 及以上 logger.info(info 信息) # 控制台显示INFO 及以上文件不显示WARNING 以下不记录 logger.warning(warning 信息) # 控制台 文件都显示 logger.error(error 信息) # 控制台 文件都显示 logger.critical(critical 信息)# 控制台 文件都显示2.4 图解日志是怎么流动的textlogger.setLevel(DEBUG) ↓ 日志实例总开关DEBUG ↓ ┌────┴────┐ ↓ ↓ 控制台处理器 文件处理器 setLevel(INFO) setLevel(WARNING) ↓ ↓ 显示 INFO及以上 显示 WARNING及以上 ↓ ↓ 屏幕 log.txt一句话总开关决定哪些日志能进系统各个处理器再根据自己的级别决定哪些显示到屏幕、哪些写到文件。2.5 多个日志实例独立模块不同模块可以用各自的日志实例互不干扰python# 在另一个文件或另一个模块里 logger2 logging.getLogger(用户模块) logger2.setLevel(logging.DEBUG) file_handler logging.FileHandler(log2.txt, encodingutf-8) file_handler.setLevel(logging.WARNING) file_formatter logging.Formatter(%(asctime)s - %(name)s - %(levelname)s - %(message)s) file_handler.setFormatter(file_formatter) logger2.addHandler(file_handler) logger2.info(用户登录了) # 只显示在屏幕 logger2.warning(用户多次输错密码) # 显示在屏幕 写入 log2.txtlogging.getLogger(用户模块)里的名字会出现在日志中方便你区分是哪块代码打的日志。2.6 日志格式占位符说明占位符含义示例%(asctime)s时间2026-07-30 14:30:25%(name)s日志实例名称__main__或用户模块%(levelname)s日志级别INFO、WARNING%(message)s日志内容你写的具体信息%(filename)s文件名demo.py%(lineno)d行号102.7 日志模块核心总结组件作用getLogger(name)创建日志实例setLevel()设置总级别StreamHandler()输出到控制台屏幕FileHandler()输出到文件Formatter()设置日志格式logger.debug/info/warning/error/critical()输出不同级别的日志 今天知识点速查装饰器部分概念说明login_required加登录校验装饰器wraps(func)保住原函数名字global user修改全局变量本质闭包 语法糖日志部分级别函数用途DEBUGlogger.debug()调试信息INFOlogger.info()常规信息WARNINGlogger.warning()警告ERRORlogger.error()错误CRITICALlogger.critical()严重错误 结尾今天两件事都不难但特别实用权限装饰器能为你的网页在未登录时提供有效保护避免非法访问和攻击。日志模块让你程序学会写日记出了错翻文件查不用靠print()一条条盯着屏幕看。两个工具让你的码农之路又获得一些技能吧各位糕手下期我们聊点啥呢保持期待吧 咱们下期见

相关新闻

Python turtle库图形编程:从基础绘制到多边形动画实战

Python turtle库图形编程:从基础绘制到多边形动画实战

1. 从零开始:为什么是海龟,以及如何让它动起来如果你刚开始接触Python,或者想找一个能立刻看到图形化成果、趣味性十足的库来入门,turtle库绝对是你的不二之选。它不像pygame那样需要处理复杂的游戏循环,也不像tkinter…

2026/7/31 5:50:05阅读更多 →
练习项目跟进es查询(day10)

练习项目跟进es查询(day10)

es查询代码es_data_router.get("/search", summary"职位搜索") async def search_jobs(# ---------- 关键词 ----------keyword: Optional[str] Query(None, description"搜索关键词,如 Java、前端"),# ---------- 筛选 ----------w…

2026/7/31 5:50:05阅读更多 →
AI论文写作工具功能解析与宏智树AI深度评测

AI论文写作工具功能解析与宏智树AI深度评测

1. 论文写作工具的现状与痛点作为一名经历过无数次论文折磨的过来人,我深知学术写作过程中的种种痛苦。从选题构思到文献综述,从数据分析到格式排版,每个环节都足以让人抓狂。特别是当deadline临近而进度滞后时,那种焦虑感简直让人…

2026/7/31 5:48:04阅读更多 →
3分钟掌握手机号码定位查询:免费开源工具让你秒查归属地

3分钟掌握手机号码定位查询:免费开源工具让你秒查归属地

3分钟掌握手机号码定位查询:免费开源工具让你秒查归属地 【免费下载链接】location-to-phone-number This a project to search a location of a specified phone number, and locate the map to the phone number location. 项目地址: https://gitcode.com/gh_mi…

2026/7/31 7:12:36阅读更多 →
Pandas数据处理入门:从数据清洗到分析导出的完整实战指南

Pandas数据处理入门:从数据清洗到分析导出的完整实战指南

1. 项目概述:为什么“头歌Python实训”是pandas入门的绝佳路径?如果你正在学习Python数据分析,或者刚接触pandas库,看到“头歌Python实训”这个标题可能会有点好奇。这其实是一个典型的、面向实践的教学项目或课程体系&#xff0c…

2026/7/31 7:12:36阅读更多 →
高效晨间仪式设计:从生物钟同步到认知优化

高效晨间仪式设计:从生物钟同步到认知优化

1. 晨间仪式:从生理到心理的启动设计早晨6:30的闹钟响起时,我的手指会条件反射般按下手机上的"停止"按钮——这个动作持续了三年,直到发现神经科学家安德鲁胡伯曼的研究:人体皮质醇水平在醒后30-60分钟达到峰值&#xf…

2026/7/31 7:12:36阅读更多 →
云端Android集群的终极底座:傲晨云手机如何凭开放架构赢得2026年8月开发者首选

云端Android集群的终极底座:傲晨云手机如何凭开放架构赢得2026年8月开发者首选

💡 摘要:当云手机从"远程真机"演进为"ARM虚拟化容器安卓低延迟串流"的一体化算力底座,开发者的核心诉求已经变成——ADB是否全开放、群控上限是否够高、72小时挂机是否稳。本文从底层架构切入,结合Python实战…

2026/7/31 7:12:36阅读更多 →
α-β-γ滤波器:从原理到嵌入式C语言实现的卡尔曼滤波简化版

α-β-γ滤波器:从原理到嵌入式C语言实现的卡尔曼滤波简化版

1. 从“猜”到“算”:为什么我们需要一个聪明的滤波器?在传感器数据处理的日常里,我们常常面临一个尴尬的局面:手里的数据,信也不是,不信也不是。比如,你用GPS模块测车辆位置,它告诉…

2026/7/31 7:12:36阅读更多 →
企业AI风险防控敏捷设计:四层框架与CI/CD集成实践

企业AI风险防控敏捷设计:四层框架与CI/CD集成实践

1. 项目概述:为什么企业AI风险防控需要“敏捷设计”?最近和几个同行聊天,发现一个挺有意思的现象:大家聊起AI大模型的应用,从AI Agent到AI编程,从AI视频到AI测试,个个都眉飞色舞,觉得…

2026/7/31 7:10:36阅读更多 →
覆盖国产 + 海外 + 开源模型,OpenClaw 2.7.9 Windows/Mac 双端部署详解

覆盖国产 + 海外 + 开源模型,OpenClaw 2.7.9 Windows/Mac 双端部署详解

🔹 工具基础介绍 OpenClaw 是开源生态中一款实用性较强的本地智能工具,凭借本地离线运行、可视化图形操作和任务自动化三大核心特性,赢得了众多用户的青睐。与普通在线对话AI工具不同,它属于能够直接操控本机软硬件的智能数字员工…

2026/7/30 15:03:16阅读更多 →
伺服阀焊完微漏毁整机?精密激光焊接三关锁住高压

伺服阀焊完微漏毁整机?精密激光焊接三关锁住高压

所谓液压伺服阀体的精密激光焊接,是用激光束对阀座壳体(通常为不锈钢或铝合金)进行密封焊接,使阀体在21-35MPa的高压液压油或压缩气体中长期运行而不发生介质泄漏。液压伺服阀是高端液压系统的"大脑"。从航空航天飞行控…

2026/7/30 12:22:27阅读更多 →
D2DX:三步实现《暗黑破坏神2》高清宽屏体验的终极指南

D2DX:三步实现《暗黑破坏神2》高清宽屏体验的终极指南

D2DX:三步实现《暗黑破坏神2》高清宽屏体验的终极指南 【免费下载链接】d2dx D2DX is a complete solution to make Diablo II run well on modern PCs, with high fps and better resolutions. 项目地址: https://gitcode.com/gh_mirrors/d2/d2dx 你是否还在…

2026/7/30 15:13:02阅读更多 →
物理复制比逻辑复制好在哪?数据库复制原理详解

物理复制比逻辑复制好在哪?数据库复制原理详解

数据库复制是把主库数据同步到备库的机制,分为逻辑复制和物理复制两种。逻辑复制传输的是 SQL 语句或行变更事件,物理复制传输的是存储引擎底层的物理日志。阿里云 PolarDB(云原生数据库)采用物理复制,在同步延迟、数据…

2026/7/31 0:00:40阅读更多 →
BilibiliDown:3分钟学会B站视频下载的终极指南

BilibiliDown:3分钟学会B站视频下载的终极指南

BilibiliDown:3分钟学会B站视频下载的终极指南 【免费下载链接】BilibiliDown (GUI-多平台支持) B站 哔哩哔哩 视频下载器。支持稍后再看、收藏夹、UP主视频批量下载|Bilibili Video Downloader 😳 项目地址: https://gitcode.com/gh_mirrors/bi/Bilib…

2026/7/31 0:00:41阅读更多 →
有哪些游戏数据AI平台?游戏行业Data+AI融合方案盘点

有哪些游戏数据AI平台?游戏行业Data+AI融合方案盘点

当前,游戏行业的“DataAI融合”已从概念验证进入价值落地阶段。根据IDC 2025年数据,中国AI游戏云市场规模已达18.6亿元;同时,游戏研发环节AI渗透率高达86%,生成式AI内容普及率超过50%。面对庞大的市场,游戏…

2026/7/31 0:00:41阅读更多 →
YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

如果你在部署 YOLOv8 时,发现推理速度只有可怜的 1-2 FPS,而别人的演示视频却能跑到 30 FPS 以上,那么问题很可能不在模型本身,而在于你的整个处理链路。很多开发者拿到一个训练好的 YOLOv8 模型后,会直接使用官方示例…

2026/7/31 0:49:33阅读更多 →
Coze与Dify对比指南:低代码AI应用开发从入门到实战

Coze与Dify对比指南:低代码AI应用开发从入门到实战

1. 从零到一:为什么你需要了解 Coze 和 Dify?如果你对 AI 应用开发感兴趣,但一看到“大模型”、“智能体”、“工作流”这些词就头疼,觉得门槛太高,那这篇文章就是为你准备的。很多开发者,包括我自己&#…

2026/7/31 5:08:18阅读更多 →
AI生图工具怎么选?2026年6月版实测对比

AI生图工具怎么选?2026年6月版实测对比

做自媒体的朋友应该都有体会:配图一直是个让人头疼的问题。2026年,AI生图工具已经非常成熟了,但工具太多反而不知道怎么选。以下是截至2026年6月我对主流AI生图工具的实测对比。Midjourney V8.1:速度之王2026年6月11日&#xff0c…

2026/7/30 15:43:46阅读更多 →