You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过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)

关键说明

  1. 异常捕获:对金额、日期输入添加错误捕获,避免非法输入导致程序崩溃。
  2. 查询结果处理:用.first()获取单个匹配记录,若不存在则返回明确的错误提示。
  3. 变量作用域修正:将exp12初始化放在分支外,确保GET请求时模板能正常渲染。
  4. 计算逻辑优化:先将费率转为小数(除以100)再计算,保留两位小数更贴合金融场景需求。

内容的提问来源于stack exchange,提问作者Pervez

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.23 20:22:27