如何在Python中将MongoDB的Cursor值返回至调用函数并解决报错
问题解决:MongoDB Cursor导致的AttributeError错误
错误原因
报错栈显示Django的clickjacking中间件尝试调用response.get()方法时失败,说明当前被当作响应对象的是MongoDB的Cursor,而Cursor没有get()方法。这通常是因为视图函数误将Cursor作为响应返回,或者在数据传递过程中Cursor被错误地当成了响应对象处理。
解决方案
1. 将Cursor转换为列表返回
MongoDB的collection.find()返回的Cursor是惰性迭代对象,不能直接在Django的视图流程中传递(尤其是不能当作响应)。需要将其转换为普通列表,这样可以在调用函数中正常使用,也不会触发响应处理错误。
修改getData函数:
def getData(value, somedate): collection = db[constantsCollection.NameData] query = {"$and": [{"value" : value}, {"datetime" : {"$regex" : somedate}}]} data = collection.find(query) return list(data) # 转换为列表后返回
2. 检查视图返回逻辑
确保所有视图函数的返回值都是Django的响应对象(比如render()返回的HttpResponse),不要误将Cursor或数据库查询结果直接返回。你的check函数当前返回的是render(request, 'backtest.html'),这是正确的,但要排查是否有其他视图函数存在返回Cursor的情况。
3. 大数据量优化(可选)
如果Cursor包含10000条数据,转换为列表会占用较多内存。此时可以考虑使用分页查询,避免一次性加载所有数据:
# 示例:分页查询前100条数据 def getData(value, somedate, page=1, page_size=100): collection = db[constantsCollection.NameData] query = {"$and": [{"value" : value}, {"datetime" : {"$regex" : somedate}}]} data = collection.find(query).skip((page-1)*page_size).limit(page_size) return list(data)
内容的提问来源于stack exchange,提问作者Harshal
相关产品推荐
相关产品推荐

