Flask API返回数据重复问题求助:67条数据库记录却返回大量重复项
问题分析与解决方案
问题根源
你的代码中final_dict是全局变量,每次调用PostList的get方法时,都会将查询到的数据库记录追加到这个全局列表中,不会清空原有内容。这就导致第一次请求返回67条数据,第二次请求返回134条(67×2),以此类推,出现数据重复且数量持续增加的情况。
另外还有一个隐藏问题:return jsonify(final_dict)之后的cursor.close()和conn.close()永远不会执行,会导致数据库连接资源无法正常释放。
修复后的代码
from flask import Flask, jsonify from flaskext.mysql import MySQL from flask_restful import Resource, Api from flask_cors import CORS app = Flask(__name__) CORS(app) #Create an instance of MySQL mysql = MySQL() #Create an instance of Flask RESTful API api = Api(app) #Set database credentials in config. app.config['MYSQL_DATABASE_USER'] = 'xxx' app.config['MYSQL_DATABASE_PASSWORD'] = 'xxx' app.config['MYSQL_DATABASE_DB'] = 'xxx' app.config['MYSQL_DATABASE_HOST'] = 'xxx' #Initialize the MySQL extension mysql.init_app(app) keys_dict = ["id", "link", "title", "date", "image", "description", "tag"] class PostList(Resource): def get(self): final_dict = [] # 将列表移到方法内部,每次请求重新初始化 conn = mysql.connect() cursor = conn.cursor() cursor.execute("""SELECT * from table ORDER BY date """) rows = cursor.fetchall() for m in rows: final_dict.append(dict(zip(keys_dict, m))) # 先关闭连接再返回响应 cursor.close() conn.close() return jsonify(final_dict) api.add_resource(PostList, '/', endpoint='') if __name__ == '__main__': app.run(debug=True)
关键修改点
- 将
final_dict的定义从全局作用域移到get方法内部,确保每次请求都创建新的空列表,彻底避免数据累积重复。 - 调整
cursor.close()和conn.close()的位置到return语句之前,保证数据库连接能正常关闭,防止资源泄漏。
内容的提问来源于stack exchange,提问作者Mi Yahn
相关产品推荐
相关产品推荐

