Flask自定义接口错误返回HTML而非JSON问题求助
解决方案
问题根源
Flask 默认没有内置 UUID 类型的路由转换器,你用的 <uuid:var_name> 语法如果没提前自定义转换器,其实不会生效——请求无效 UUID 格式时,Flask 会直接判定路由不匹配,触发默认的 HTML 404 页面,根本不会进入你的视图函数执行错误逻辑。
两种可行解决方法
方法1:自定义UUID路由转换器 + 全局404错误处理
先定义一个UUID转换器,让Flask只接受符合格式的请求进入视图,同时覆盖默认404返回JSON:
from flask import Flask, jsonify from werkzeug.routing import BaseConverter import uuid app = Flask(__name__) # 自定义UUID路由转换器 class UUIDConverter(BaseConverter): def to_python(self, value): try: return uuid.UUID(value) except ValueError: # 格式错误时触发404 raise ValueError("Invalid UUID") def to_url(self, value): return str(value) # 注册转换器到Flask app.url_map.converters['uuid'] = UUIDConverter # 覆盖默认404错误响应 @app.errorhandler(404) def handle_404(error): return jsonify({"error_message": "person not found"}), 404 # 你的接口视图 @app.route('/person/<uuid:var_name>') def get_person(var_name): # 这里写你的人员数据查询逻辑 person = {"id": str(var_name), "name": "Alice"} return jsonify(person) if __name__ == '__main__': app.run(debug=True)
方法2:视图内直接验证UUID格式
如果不想自定义转换器,也可以在视图里先校验格式,不符合直接返回JSON错误:
from flask import Flask, jsonify import uuid app = Flask(__name__) @app.route('/person/<var_name>') def get_person(var_name): # 第一步:验证UUID格式 try: uuid.UUID(var_name) except ValueError: return jsonify({"error_message": "person not found"}), 404 # 第二步:查询人员数据 person = {"id": var_name, "name": "Bob"} # 如果人员不存在也返回同样错误 if not person: return jsonify({"error_message": "person not found"}), 404 return jsonify(person) # 处理其他路由不匹配的404情况 @app.errorhandler(404) def handle_404(error): return jsonify({"error_message": "person not found"}), 404 if __name__ == '__main__': app.run(debug=True)
注意事项
- 调试模式下,Flask 默认的错误页面不会覆盖自定义响应——只要你注册了
@app.errorhandler(404),不管debug模式是否开启,都会返回你定义的JSON响应。 - 如果需要区分「UUID格式错误」和「人员不存在」,可以在方法2里返回不同的错误信息,比如格式错误返回
"Invalid UUID format",人员不存在返回"person not found"。
内容的提问来源于stack exchange,提问作者Bitts
相关产品推荐
相关产品推荐

