如何通过Flask+Python从MySQL按日期差查询费率并计算佣金?
问题修复与代码优化
先梳理你代码中的核心问题,再给出修正后的完整实现:
核心问题点
- 类型不兼容:
investmentamount被转为字符串,后续计算时会触发类型错误,需转为数值类型。 - 查询结果未提取实际值:
filter()返回的是SQLAlchemy查询集,不是具体的费率数值,必须通过.first()获取模型实例后,再提取对应费率字段。 - 变量作用域错误:
exp12和返回逻辑写在POST判断分支外,GET请求时会因变量未定义报错。 - 无异常兜底逻辑:若天数差匹配不到任何区间,或输入非法日期/金额,会直接崩溃,需添加错误处理。
- 日期顺序未校验:未处理结算日期晚于到期日期的情况,会得到负的天数差,需提前拦截。
修正后的代码
from flask import Flask, request, render_template from datetime import datetime # 假设你的Interbankbrokerage模型定义如下,第三列费率字段为rate # class Interbankbrokerage(db.Model): # id = db.Column(db.Integer, primary_key=True) # fromdays = db.Column(db.Integer) # todays = db.Column(db.Integer) # rate = db.Column(db.Float) # 存储费率的第三列 @app.route('/calculate', methods=['POST','GET']) def submit(): exp12 = {} # 初始化空字典,确保GET请求时变量存在 brokerageamount = None if request.method == 'POST': # 提取表单数据并处理类型 settlementdate = request.form['settlementdate'] maturitydate = request.form['maturitydate'] try: investmentamount = float(request.form['investmentamount']) except ValueError: exp12['Error'] = '投资金额必须为有效数字' return render_template('placements.html', brrate=exp12) # 日期解析与校验 try: d1 = datetime.strptime(settlementdate, "%Y-%m-%d") d2 = datetime.strptime(maturitydate, "%Y-%m-%d") except ValueError: exp12['Error'] = '日期格式错误,请使用YYYY-MM-DD格式' return render_template('placements.html', brrate=exp12) maturitydays = (d2 - d1).days if maturitydays < 0: exp12['Error'] = '到期日期不能早于结算日期' return render_template('placements.html', brrate=exp12) # 查询匹配的费率区间 rate_record = Interbankbrokerage.query.filter( Interbankbrokerage.fromdays <= maturitydays, Interbankbrokerage.todays >= maturitydays ).first() if not rate_record: exp12['Error'] = f'未找到天数{maturitydays}对应的费率区间' return render_template('placements.html', brrate=exp12) brokeragerate = rate_record.rate # 提取第三列的费率数值 # 计算手续费金额,调整运算顺序更符合金融逻辑,保留两位小数 brokerageamount = round(investmentamount * brokeragerate / 100 * maturitydays / 365, 2) exp12 = { 'Brokerage Rate %': brokeragerate, 'Brokerage Amount': brokerageamount, 'Maturity Days': maturitydays } return render_template('placements.html', brrate=exp12)
关键说明
- 异常捕获:对金额、日期输入添加错误捕获,避免非法输入导致程序崩溃。
- 查询结果处理:用
.first()获取单个匹配记录,若不存在则返回明确的错误提示。 - 变量作用域修正:将
exp12初始化放在分支外,确保GET请求时模板能正常渲染。 - 计算逻辑优化:先将费率转为小数(除以100)再计算,保留两位小数更贴合金融场景需求。
内容的提问来源于stack exchange,提问作者Pervez
相关产品推荐
相关产品推荐

