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蓝图设置自定义错误页面无法正常生效怎么办?
.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)
关键点说明:
- 使用
@bp.app_errorhandler而不是@bp.errorhandler:前者注册到应用实例,后者只对蓝图内的路由生效 - 确保蓝图先注册:错误处理器需要在蓝图注册后才能生效
- 模板文件位置:确保
templates/404.html模板文件存在 - 避免冲突:不要在应用和蓝图重复定义相同错误码的处理器
如果还是不行,检查:
- 蓝图是否成功注册(查看
app.url_map) - 错误处理器装饰器是否写对
- 是否在其他地方覆盖了错误处理
总结建议:确保使用@blueprint.app_errorhandler装饰器并正确注册蓝图。
.python 是啥?
(而且这种情况应该上全部代码吧. 就三行 没上下文怎么知道哪出错了…
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 是全局的

