Flask对接MongoDB向API端点传递ID时触发TypeError错误如何解决
问题根本原因
报错的核心原因是代码笔误导致传入了错误的变量给ObjectId构造器:
find_restaurants函数的入参名为_id,但你在构造查询条件时错误引用了未定义的变量id,id是Python内置的全局函数,不是你传递的ID参数,因此触发类型错误:TypeError: id must be an instance of (bytes, str, ObjectId), not <class 'builtin_function_or_method'>- 额外的小问题:你已经注册了
ObjectIdConverter转换器到Flask路由系统,但未在路由规则中启用,无法提前校验传入ID的合法性,无效ID会直接触发服务端错误。
修复方案
必改项:修正变量名
修改mongoflask.py中find_restaurants函数的查询条件行,将id改为入参名_id:
# 改前 query["_id"] = ObjectId(id) # 改后 query["_id"] = ObjectId(_id)
改完之后直接重启服务即可恢复正常,请求带ID的接口会正常返回数据。
可选优化项:启用路由ID校验
你已经实现了ObjectId路由转换器,可以调整路由规则提前校验ID格式,避免无效ID进入业务逻辑:
- 修改
app.py中的单条查询路由规则,指定转换器类型:
# 改前 @app.route("/api/v1/restaurant/<_id>") # 改后 @app.route("/api/v1/restaurant/<objectid:_id>")
- 此时路由会自动将符合格式的ID转为
ObjectId类型传入视图函数,你可以去掉find_restaurants中的重复转换逻辑,避免二次转换报错:
if _id != "": query["_id"] = _id
调整后传入非法ObjectId格式的请求会直接返回404,符合REST接口的设计规范。
内容的提问来源于stack exchange,提问作者R. Barrett
相关产品推荐
相关产品推荐

