You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.21 19:42:40