Flask开发MongoDB REST API按ID查询单条数据返回None报错
问题定位
- 核心直接原因:视图函数缺少返回逻辑。现有代码仅完成了查询赋值操作,无论
music_obj是否查询到结果,都没有编写return语句返回符合Flask要求的响应对象,Flask强制要求所有视图函数的所有逻辑分支都必须返回可转为响应的内容。 - ID格式异常:从日志的请求路径
/api/bmat/%22T0350190010%22可以看出,你传入的ID前后携带了双引号,%22是双引号的URL编码,实际传入视图函数的ID值为"T0350190010"(带双引号),和数据库中存储的IDT0350190010不匹配,直接导致查询结果为None。 - 路由路径不匹配:代码中定义的路由是
@app.route('/api/dd/<id>'),但实际请求的路径是/api/bmat/xxx,路由不匹配也会导致逻辑无法正常执行。 - MongoDB ID类型不兼容:如果使用MongoDB默认的
ObjectId类型作为主键,直接传入字符串ID查询会查不到结果,需要先将字符串转为ObjectId类型再执行查询。
解决方法
- 先修正路由路径和请求路径保持一致,补全所有逻辑分支的返回语句,增加ID清洗、空值判断逻辑,示例代码如下:
from bson import ObjectId from flask import jsonify, request # 修正路由路径为实际请求的前缀 @app.route('/api/bmat/<id>',methods=['GET','PUT','DELETE']) def api_each_bmat(id): # 先清洗掉ID前后多余的引号 clean_id = id.strip('"') if request.method == "GET": # 如果数据库主键是自定义字符串类型,可跳过ObjectId转换步骤直接用clean_id查询 try: query_id = ObjectId(clean_id) except: return jsonify({"msg": "ID格式非法"}), 400 music_obj = music.objects(id=query_id).first() # 空值判断,查询不到直接返回404 if not music_obj: return jsonify({"msg": "对应数据不存在"}), 404 # 查询到结果则序列化后返回,字段根据你的实际模型调整 return jsonify({ "id": str(music_obj.id), "name": music_obj.name, # 补充其他需要返回的字段 }), 200 # 补全其他请求方法的逻辑和返回值,避免同类报错 elif request.method == "PUT": # 你的更新逻辑 return jsonify({"msg": "更新成功"}), 200 elif request.method == "DELETE": # 你的删除逻辑 return jsonify({"msg": "删除成功"}), 200
- 前端发起请求时不要给ID加引号,直接请求
/api/bmat/T0350190010即可,避免传入多余符号导致匹配失败。
内容的提问来源于stack exchange,提问作者Naveen Rishishwar
相关产品推荐
相关产品推荐

