Python中Flask蓝图设置自定义错误页面无法正常生效怎么办?

按照官方文档,在蓝图文件夹新建一个 errors.python 文件。写上
@main.app_errorhandler(404)
def page_not_found(e):
return render_template(‘404.html’),404
在蓝图的 init.python 写上 from . import errors
现在有几点疑问,1、按照我的想法,当写上 app_errorhandler,应该是用来自定义全局错误页面的,errorhandler 是用来自定义蓝图内部的错误页面的。2、运行过后,生成的 404 错误还是显示默认的 404 错误页面。app_errorhandler 和 errorhandler 都不生效。
Python中Flask蓝图设置自定义错误页面无法正常生效怎么办?


13 回复

.python 文件???没用过,不了解


遇到Flask蓝图自定义错误页面不生效的问题,通常是蓝图注册时机或错误处理器作用域导致的。核心在于确保错误处理器在蓝图注册后生效,并正确绑定到应用实例。

下面是一个完整的解决方案示例:

from flask import Flask, render_template, Blueprint

# 创建蓝图
bp = Blueprint('main', __name__)

@bp.route('/')
def index():
    return '主页'

@bp.route('/error')
def trigger_error():
    # 模拟404错误
    from flask import abort
    abort(404)

# 关键:在蓝图内部定义错误处理器
@bp.app_errorhandler(404)
def page_not_found(e):
    return render_template('404.html'), 404

def create_app():
    app = Flask(__name__)
    
    # 先注册蓝图
    app.register_blueprint(bp)
    
    # 注意:不要在应用层面重复定义相同的错误处理器
    # 除非你想覆盖蓝图中的处理器
    
    return app

if __name__ == '__main__':
    app = create_app()
    app.run(debug=True)

关键点说明:

  1. 使用@bp.app_errorhandler而不是@bp.errorhandler:前者注册到应用实例,后者只对蓝图内的路由生效
  2. 确保蓝图先注册:错误处理器需要在蓝图注册后才能生效
  3. 模板文件位置:确保templates/404.html模板文件存在
  4. 避免冲突:不要在应用和蓝图重复定义相同错误码的处理器

如果还是不行,检查:

  • 蓝图是否成功注册(查看app.url_map
  • 错误处理器装饰器是否写对
  • 是否在其他地方覆盖了错误处理

总结建议:确保使用@blueprint.app_errorhandler装饰器并正确注册蓝图。

.python 是啥?
(而且这种情况应该上全部代码吧. 就三行 没上下文怎么知道哪出错了…

文件名是 errors.py,还是 errors.python。正确的为 errors.py
你的程序应该是没有错的

from . import errors 是不是写在文件最后的面?

是 py 文件。我试了一下。在根目录的__init__.py ,写上
.errorhandler(404)
def page_not_found(e):
return render_template(‘404.html’),404
是可以正常显示自定义错误界面的。

是的

最好上传下项目,不然光你这样说没法定位问题

def _find_error_handler(self, e):
“”“Return a registered error handler for an exception in this order:
blueprint handler for a specific code, app handler for a specific code,
blueprint handler for an exception class, app handler for an exception
class, or None if a suitable handler is not found.
“””
exc_class, code = self._get_exc_class_and_code(type(e))

for name, c in (
(request.blueprint, code), (None, code),
(request.blueprint, None), (None, None)
):
handler_map = self.error_handler_spec.setdefault(name, {}).get©


看了下 Flask 相关的源码,貌似在 request.blueprint 这一步中本来是获取蓝图名称的,但是我调试后值一直为 None,也就是使用 app.errorhandler 进行装饰的函数

在__init__.py 中创建了蓝本吗? main = Blueprint(‘main’, name)

晚上又运行了一次,就正常运行了。一联萌币。谢谢了。


昨天也有点懵, 其实 app_errorhandler 是对于蓝图起作用的,errorhandler 是对于全局的异常处理

哎呀又看错了,app_errorhandler 是全局的

回到顶部