:错误处理与日志——打造健壮的Web应用)
1. 自定义错误页面默认情况下Flask对404等错误会显示简单的黑底白字页面。使用app.errorhandler装饰器可以为特定HTTP状态码定制错误页面from flask import Flask, render_template app Flask(__name__) # 处理404错误——页面未找到 app.errorhandler(404) def page_not_found(error): return render_template(404.html), 404 # 处理500错误——服务器内部错误 app.errorhandler(500) def internal_error(error): return render_template(500.html), 500 # 处理403错误——禁止访问 app.errorhandler(403) def forbidden(error): return render_template(403.html), 403templates/404.html!DOCTYPE html html head title404 - 页面不存在/title style body { text-align: center; padding-top: 60px; font-family: Arial; } h1 { font-size: 72px; color: #e74c3c; margin: 0; } p { color: #666; font-size: 18px; } a { color: #3498db; } /style /head body h1404/h1 p抱歉你访问的页面不存在。/p pa href/返回首页/a/p /body /html⚠️重要在errorhandler装饰的函数中return必须显式带上状态码。如果不写, 404Flask会默认返回200状态码浏览器和搜索引擎不会认为这是一个错误页面。2. 异常类注册除了状态码app.errorhandler还可以直接注册异常类from werkzeug.exceptions import HTTPException app.errorhandler(HTTPException) def handle_http_exception(error): 统一处理所有HTTP异常如400, 401, 403, 404等 return f h1HTTP 错误 {error.code}/h1 p{error.description}/p pa href/返回 RUNOOB 首页/a/p , error.code # 也可以注册自定义异常类 class CustomError(Exception): pass app.errorhandler(CustomError) def handle_custom_error(error): return 自定义错误发生了, 4003. 使用abort触发错误在视图函数中使用abort()主动触发HTTP错误from flask import abort # 模拟文章数据库 articles { 1: {title: Flask 入门教程}, 2: {title: Python 基础}, } app.get(/article/int:article_id) def view_article(article_id): article articles.get(article_id) if article is None: # 文章不存在返回404 abort(404, descriptionf文章 ID {article_id} 不存在) return fh1{article[title]}/h1 app.get(/admin) def admin_panel(): # 没有权限访问管理后台 abort(403, description你没有管理员权限)abort()的description参数会被传递给errorhandler可以在自定义错误页面中显示详细信息。4. 日志记录Flask使用Python标准库的logging模块通过app.logger即可记录日志。日志对于排查问题至关重要——不要只用print()日志提供了更丰富的上下文和更好的控制力。from flask import Flask, request app Flask(__name__) app.route(/) def index(): # 不同级别的日志 app.logger.debug(访问首页) app.logger.info(用户来自 IP: %s, request.remote_addr) app.logger.warning(检测到异常访问模式) app.logger.error(数据库连接失败) app.logger.critical(磁盘空间不足服务即将中止) return OK日志级别由低到高级别使用场景DEBUG开发调试时的详细信息生产环境默认不输出INFO一般的运行信息如请求记录、服务启动WARNING警告信息潜在问题但不影响当前运行ERROR错误信息某个功能出错但服务还在运行CRITICAL严重错误可能导致服务停止在Debug模式下Flask的日志级别自动设为DEBUG。生产环境中应按需设置为INFO或WARNING避免输出太多无用信息。5. 配置日志输出到文件将日志写入文件便于事后分析和排查import logging from logging.handlers import RotatingFileHandler # 配置文件日志处理器——日志文件达到10MB后自动轮转 handler RotatingFileHandler( runoob_app.log, maxBytes10 * 1024 * 1024, # 单个文件最大10MB backupCount5 # 保留最近5个备份 ) # 设置日志格式 handler.setFormatter(logging.Formatter( [%(asctime)s] %(levelname)s in %(module)s: %(message)s )) # 将handler添加到Flask的logger app.logger.addHandler(handler) app.logger.setLevel(logging.INFO)日志格式常用占位符占位符说明%(asctime)s时间戳%(levelname)s日志级别INFO、ERROR等%(module)s模块名%(funcName)s函数名%(lineno)d行号%(message)s日志消息6. 捕获未处理的异常使用app.errorhandler(500)可以捕获未处理的异常并记录日志import traceback app.errorhandler(500) def internal_error(error): # 记录完整的异常堆栈 app.logger.error(服务器内部错误:\n%s, traceback.format_exc()) # 向用户显示友好的错误页面 return h1500 - 服务器内部错误/h1 p抱歉服务器遇到了一个意外错误。我们已记录该问题请稍后再试。/p p如果持续出现此问题请联系技术支持。/p , 5007. 蓝图中的错误处理蓝图也支持独立的错误处理器只作用于该蓝图的路由# auth.py from flask import Blueprint, render_template bp Blueprint(auth, __name__) bp.errorhandler(404) def auth_not_found(error): auth蓝图专用的404错误页面 return render_template(auth/404.html), 404注册方式作用范围app.errorhandler全局生效bp.errorhandler仅在该蓝图路由中生效8. 常见HTTP错误码速查状态码含义常见原因400Bad Request请求参数格式错误、缺少必要字段401Unauthorized用户未登录或认证失败403Forbidden用户已登录但没有访问权限404Not Found资源文章、用户等不存在405Method Not Allowed使用了错误的HTTP方法429Too Many Requests请求频率超过限制500Internal Server Error代码异常、数据库连接失败等未处理错误502Bad Gateway代理服务器收到无效响应503Service Unavailable服务暂时不可用9. 错误处理最佳实践实践说明✅自定义错误页面使用app.errorhandler覆盖默认错误页面保持品牌一致性✅记录错误日志在errorhandler中记录traceback便于排查问题✅区分客户端错误(4xx)和服务器错误(5xx)前者返回提示信息后者记录完整堆栈✅使用环境变量控制日志级别开发环境用DEBUG生产环境用INFO或WARNING✅敏感信息脱敏错误日志中不要记录密码、Token等敏感信息❌在生产环境暴露堆栈不要向用户显示完整的异常堆栈❌忽略错误每个abort()和可能抛异常的地方都应有对应的处理小结本章全面讲解了Flask的错误处理与日志机制。app.errorhandler装饰器可自定义各类HTTP错误页面支持状态码和异常类两种注册方式视图函数中使用abort()主动触发错误并传递描述信息日志通过app.logger记录支持DEBUG到CRITICAL五个级别可配合RotatingFileHandler实现日志文件的自动轮转traceback.format_exc()可捕获异常堆栈蓝图也支持独立的错误处理器。完善的错误处理加上规范的日志记录是打造健壮可靠Web应用的必备手段。