登录
首页 >  文章 >  python教程

怎样处理Python Flask项目中的404错误_自定义errorhandler捕获

时间:2026-05-05 17:40:45 146浏览 收藏

学习知识要善于思考,思考,再思考!今天golang学习网小编就给大家带来《怎样处理Python Flask项目中的404错误_自定义errorhandler捕获》,以下内容主要包含等知识点,如果你正在学习或准备学习文章,就都不要错过本文啦~让我们一起来看看吧,能帮助到你就更好了!

@app.errorhandler(404)必须在app.run()前注册,且需显式返回状态码404;若在工厂函数、条件分支或蓝图中错误注册则失效,全局处理须用@app.errorhandler而非@bp.errorhandler。

怎样处理Python Flask项目中的404错误_自定义errorhandler捕获

@app.errorhandler(404) 必须在 app.run() 前注册

Flask 的 @app.errorhandler(404) 不是“写完就生效”的装饰器,它只是标记函数,真正注册发生在应用实例初始化后、app.run() 调用前。如果用工厂函数模式(create_app()),却把 @app.errorhandler(404) 写在函数体外或未被调用的分支里,它根本不会挂载。

常见失效场景:

  • if __name__ == '__main__': 块里写 @app.errorhandler(404) —— 此时 app 已创建,但装饰器执行时机晚于注册阶段
  • 蓝图中定义了 @bp.errorhandler(404),却忘了调用 app.register_blueprint(bp)
  • 错误处理器定义在某个条件判断内(比如 if DEBUG:),而实际运行时条件不满足

404 错误只捕获路由未匹配,不捕获视图内 raise NotFound()

注意:@app.errorhandler(404) 默认只响应「请求路径完全没匹配到任何 @app.route」的情况。它不会捕获你在视图函数里手动 raise NotFound()abort(404) 后又被上层异常处理器吞掉的情形 —— 这类抛出仍会走 @app.errorhandler(404),但前提是异常没被中间件、before_request 钩子或 WSGI 层提前截断。

关键区别:

  • abort(404) → 触发 NotFound 异常 → 走 @app.errorhandler(404)
  • raise Exception('xxx') → 不是 HTTP 异常 → 不触发 @app.errorhandler(404),可能落到 @app.errorhandler(500) 或默认 500 页面
  • raise NotFound() → 显式抛出 werkzeug 异常 → 正常触发 @app.errorhandler(404)

返回值必须显式带状态码,否则默认 200

很多人写完 @app.errorhandler(404) 函数,返回 JSON 或字符串,结果浏览器看到的是 200 OK 状态,前端逻辑错乱。这是因为 Flask 不会自动把返回值的状态码设为 404 —— 你得自己带上。

正确写法示例:

@app.errorhandler(404)
def not_found(error):
    return {"error": "resource not found"}, 404  # ← 状态码必须显式写在这里

错误写法:

@app.errorhandler(404)
def not_found(error):
    return {"error": "resource not found"}  # ← 缺少状态码,响应是 200

其他可接受返回形式:

  • return render_template('404.html'), 404
  • return jsonify({"error": "not found"}), 404
  • return make_response("Not Found", 404)

蓝图里的 404 处理器只对蓝图子路径生效

如果你注册了蓝图 app.register_blueprint(auth, url_prefix='/auth'),并在 auth 蓝图里写了 @auth.errorhandler(404),那它只捕获 /auth/xxx 这类路径下未匹配的请求,不会覆盖全局 /api/users/123 这样的非蓝图路径。

想统一处理所有 404,必须在主 app 实例上注册;若需分层控制,建议:

  • 主 app 注册兜底 @app.errorhandler(404)
  • 各蓝图按需注册自己的 @bp.errorhandler(404),仅处理该模块内部逻辑级 404(比如用户存在但权限不足,业务上算“找不到”)
  • 避免在多个地方注册同码处理器,后注册的会覆盖先注册的

404 处理器看似简单,但最容易栽在注册时机、作用域隔离和状态码遗漏这三点上。尤其是多蓝图 + 工厂函数项目,建议在 create_app() 返回前,统一检查所有 errorhandler 是否已通过 app.register_error_handler() 显式调用。

理论要掌握,实操不能落!以上关于《怎样处理Python Flask项目中的404错误_自定义errorhandler捕获》的详细介绍,大家都掌握了吧!如果想要继续提升自己的能力,那么就来关注golang学习网公众号吧!

资料下载
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>