El manejador de errores de Blueprint 404 no se activa bajo el prefijo url de blueprint

He creado un plano con un controlador de error 404 . Sin embargo, cuando voy a direcciones URL no existentes bajo el prefijo del modelo, se muestra la página 404 estándar en lugar de mi página personalizada. ¿Cómo puedo hacer que el plano maneje los errores 404 correctamente?

La siguiente es una aplicación corta que demuestra el problema. Navegando a http://localhost:5000/simple/asdf no mostrará la página de error del plano.

 #!/usr/local/bin/python # coding: utf-8 from flask import * from config import PORT, HOST, DEBUG simplepage = Blueprint('simple', __name__, url_prefix='/simple') @simplepage.route('/') def simple_root(): return 'This simple page' @simplepage.errorhandler(404) def error_simple(err): return 'This simple error 404', err app = Flask(__name__) app.config.from_pyfile('config.py') app.register_blueprint(simplepage) @app.route('/', methods=['GET']) def api_get(): return render_template('index.html') if __name__ == '__main__': app.run(host=HOST, port=PORT, debug=DEBUG) 

La documentación menciona que los controladores de error 404 no se comportarán como se espera en los planos. La aplicación maneja el enrutamiento y genera un 404 antes de que la solicitud llegue al plano. El controlador 404 aún se activará para abort(404) porque eso sucede después del enrutamiento en el nivel de plano.

Esto es algo que podría solucionarse en Flask (hay un problema abierto al respecto). Como solución alternativa, puede hacer su propio enrutamiento de errores dentro del controlador 404 de nivel superior.

 from flask import request, render_template @app.errorhandler(404) def handle_404(e): path = request.path # go through each blueprint to find the prefix that matches the path # can't use request.blueprint since the routing didn't match anything for bp_name, bp in app.blueprints.items(): if path.startswith(bp.url_prefix): # get the 404 handler registered by the blueprint handler = app.error_handler_spec.get(bp_name, {}).get(404) if handler is not None: # if a handler was found, return it's response return handler(e) # return a default response return render_template('404.html'), 404