Flask连接MySQL触发AssertionError问题求助
问题原因与解决方法
错误根源
你当前的代码在每次请求进来时(路由函数mysqlselect内部)才初始化MySQL(app),而Flask-MySQL的初始化逻辑会尝试给Flask应用注册teardown_request钩子函数。但此时应用已经启动并处理了第一个请求,Flask不允许在请求处理阶段再修改应用的设置钩子,因此抛出AssertionError。
修复方案
把MySQL实例的初始化移到路由定义之前、应用配置完成之后,确保在app.run()执行前完成所有应用扩展的初始化:
import os from flask import Flask from flaskext.mysql import MySQL app=Flask(__name__) # 数据库配置 app.config['MYSQL_DATABASE_HOST'] = 'localhost' app.config['MYSQL_DATABASE_USER'] = 'mydbuser' app.config['MYSQL_DATABASE_PASSWORD'] = 'mypassword' app.config['MYSQL_DATABASE_DB'] = 'mydatabasename' # 全局初始化MySQL实例,放在路由之前 mysql = MySQL(app) @app.route('/mysqltest') def mysqlselect(): cnx = mysql.connect() # 直接使用全局的mysql实例连接 cursor=cnx.cursor() cursor.execute(''' select tk_date from token ''') data=cursor.fetchall() print(data) cursor.close() cnx.close() # 建议同时关闭数据库连接 return "test" if __name__=='__main__': app.run(debug=True)
额外说明
- 不要在请求处理函数内重复初始化扩展实例,这类操作必须在应用启动前完成,确保所有钩子和配置都被正确注册。
- 用完数据库连接后记得调用
cnx.close()释放资源,避免连接泄漏。
内容的提问来源于stack exchange,提问作者Slim KETARI
相关产品推荐
相关产品推荐

