Python Flask Web应用基于Windows认证连接SQL Server插入数据报TypeError
错误定位与修复方案
核心报错触发原因
- Flask应用实例未初始化:代码导入了Flask类,但从未执行
app = Flask(__name__)创建应用实例,直接使用@app.route装饰器时,解释器无法定位有效的app对象,最终触发TypeError: 'type' object is not subscriptable。 - 表单字段赋值误加行尾逗号:
Loan_Amount、Monthly_Payment、Loan_Tram三个变量赋值时,行尾多写了英文逗号,Python会自动将这三个变量解析为单元素元组,而非表单提交的字符串值,传参时会引发后续数据类型不匹配问题。 - Flask依赖未完整导入:代码中使用了
render_template、url_for两个Flask内置方法,但从未从flask模块导入,后续调用时会触发未定义错误。
其他会导致运行失败的配置缺陷
- Windows身份验证连接字符串配置错误:当前拼接的连接字符串包含空值的
uid、pwd参数,不符合Windows认证的ODBC连接规范,需指定Trusted_Connection=yes替代账号密码参数。 - 数据库配置存在转义问题:config.py中的Server名称包含反斜杠,普通Python字符串会将
\K识别为无效转义序列,导致连接目标异常。 - 驱动兼容问题:默认使用的
SQL Server是系统内置的旧版ODBC驱动,存在兼容风险,优先推荐使用新版ODBC Driver 17 for SQL Server。
分步修复代码
1. 修正数据库配置文件config.py
# SQL Server Database Connection Properties(Windows身份验证模式) DATABASE_CONFIG = { 'Driver': 'ODBC Driver 17 for SQL Server', # 无新版驱动时可改回'SQL Server' 'Server': r'NIRJOR\KHUNDOKERNIRJOR', # 加r前缀避免反斜杠转义 'Database': 'HalifaxDatabase', 'Trusted_Connection': 'yes' # 启用Windows身份验证,无需账号密码 }
2. 修正数据库连接模块db_connection.py
import pypyodbc import config # 返回数据库连接对象 def getConnection(): conn_str = ( f"Driver={{{config.DATABASE_CONFIG['Driver']}}};" f"Server={config.DATABASE_CONFIG['Server']};" f"Database={config.DATABASE_CONFIG['Database']};" f"Trusted_Connection={config.DATABASE_CONFIG['Trusted_Connection']};" ) connection = pypyodbc.connect(conn_str) return connection
3. 修正主程序main.py
from flask import Flask, redirect, request, render_template, url_for import db_connection as dbConn # 必须先初始化Flask应用实例 app = Flask(__name__) # 补全跳转目标视图,确保路由名匹配 @app.route('/') def CompleteApplication(): return render_template("CompleteApplication.html") @app.route('/add_loan', methods=['POST']) def add_loan(): if request.method == "POST": # 移除所有行尾多余逗号,确保获取的是纯字符串值 Account_Number = request.form['Account_Number'] Loan_Amount = request.form['Loan_Amount'] Monthly_Payment = request.form['Monthly_Payment'] Interest_Rate = request.form['Interest_Rate'] Loan_Tram = request.form['Loan_Tram'] connection = dbConn.getConnection() try: insert_query = '''INSERT INTO Loan_Details (Account_Number, Loan_Amount, Monthly_Payment, Interest_Rate, Loan_Tram) VALUES (?,?,?,?,?);''' cursor = connection.cursor() cursor.execute(insert_query, [Account_Number, Loan_Amount, Monthly_Payment, Interest_Rate, Loan_Tram]) connection.commit() finally: # 确保数据库连接用完正常释放 connection.close() return redirect(url_for('CompleteApplication')) return render_template("CompleteApplication.html") if __name__ == '__main__': app.run(debug=True)
额外注意事项
- 字段拼写校验:当前代码中
Loan_Tram疑似为Loan_Term的拼写错误,需同步前端表单的字段名和后端取数的字段名,避免提交时无法获取值。 - 若使用旧版ODBC驱动
SQL Server,需保证连接字符串中无多余的空值账号密码参数,否则会触发认证失败错误。 - 数据库操作时建议增加异常捕获逻辑,避免未处理的数据库异常导致服务崩溃。
内容的提问来源于stack exchange,提问作者user8705895
相关产品推荐
相关产品推荐

