如何在Flask中针对特定域名模式配置自定义错误处理器
你当前的写法之所以对未定义的api子域名路径不生效,是因为蓝图的错误处理器仅会处理该蓝图下路由抛出的错误。如果请求路径没有命中api蓝图定义的任何路由,Flask会直接走应用全局的404逻辑,不会触发蓝图的错误处理器。下面给出两种可落地的解决方案:
方案1:使用应用级全局错误处理器判断子域名
这个方案实现最简单,直接在全局404处理逻辑中根据子域名类型返回对应格式的响应即可。
首先你需要先配置Flask的SERVER_NAME确保子域名可以被正确识别:
app.config['SERVER_NAME'] = 'localhost:5000'
之后注册全局404错误处理器:
from flask import request, jsonify, render_template @app.errorhandler(404) def global_404_handler(e): if request.subdomain == 'api': return jsonify(error=str(e)), 404 # 非api子域名返回默认HTML错误页,按你原有逻辑实现即可 return render_template('errors/404.html'), 404
方案2:给api蓝图增加万能匹配兜底路由
如果你不想把业务逻辑写到全局错误处理器里,可以在api蓝图下新增一个优先级最低的万能匹配路由,所有未命中具体业务路由的api子域名请求都会走到这个路由,主动抛出404即可触发你已经定义好的蓝图错误处理器:
# 新增到你的api蓝图定义中即可 @api.route('/', subdomain='api', defaults={'path': ''}) @api.route('/<path:path>', subdomain='api') def api_catch_all(path): abort(404)
这个方案不需要修改全局错误处理逻辑,所有api相关的错误逻辑都收敛在api蓝图内部,耦合度更低。
内容的提问来源于stack exchange,提问作者irahorecka
相关产品推荐
相关产品推荐

