Flask全局处理413状态码错误时如何重渲染触发异常的原视图
Flask 413全局错误处理器返回原页面实现方案
不需要手动定位抛出异常的对应视图,也不需要给每个视图加try/catch块,利用请求上下文自带的来源信息就能实现需求。
核心实现
413(请求实体过大)异常触发时,请求上下文依然可用,直接读取request.referrer(即触发本次请求的来源页面地址)做重定向即可,用户看到的就是原页面,且你之前写的flash消息会正常在页面顶部渲染:
from flask import request, flash, redirect @app.errorhandler(413) def request_entity_too_large(error): flash("File too large", "error-box") return redirect(request.referrer), 413
重定向时请携带413状态码返回,避免中间缓存、搜索引擎把错误响应当成正常200页面收录。
兼容优化
- 针对部分极端客户端不携带Referer请求头的场景,可以加兜底跳转地址,比如跳站点首页:
from flask import url_for # 替换url_for里的端点为你自己的首页路由端点 return redirect(request.referrer or url_for("index")), 413 - 如果项目同时存在HTML页面和JSON接口,可以加请求类型判断做适配,避免接口请求返回HTML重定向响应:
from flask import jsonify @app.errorhandler(413) def request_entity_too_large(error): if request.is_json: return jsonify(code=413, msg="File too large"), 413 flash("File too large", "error-box") return redirect(request.referrer or url_for("index")), 413
为什么不直接获取原视图重渲染
你不需要在错误处理器里强行匹配触发异常的视图:当请求体大小超过Flask配置的MAX_CONTENT_LENGTH时,异常是Werkzeug在解析请求体阶段就抛出的,此时请求还没进入路由调度、视图函数匹配的流程,错误处理器上下文中拿不到视图端点、视图入参这些必要信息,强行解析路由的代码复杂度远高于直接重定向Referer的方案,没有实际使用价值。
内容的提问来源于stack exchange,提问作者liyche
相关产品推荐
相关产品推荐

