我创建了带有404错误处理程序的蓝图。但是,当我转到蓝图前缀下的不存在的URL时,将显示标准404页面,而不是我的自定义页面。如何使蓝图正确处理404错误?
404
以下是演示该问题的简短应用程序。导航到http://localhost:5000/simple/asdf不会显示蓝图的错误页面。
http://localhost:5000/simple/asdf
#!/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)
该文档提到404错误处理程序在蓝图上的行为不符合预期。该应用程序处理路由并在请求到达蓝图之前引发404。404处理程序仍将激活,abort(404)因为这是在蓝图级别进行路由之后发生的。
abort(404)
Flask可能会修复此问题(这是一个未解决的问题)。解决方法是,您可以在顶级404处理程序中进行自己的错误路由。
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