Flask货币转换器:如何读取CSV文件并根据POST请求的货币代码计算兑换金额
解决Flask货币转换器的CSV数据匹配与计算问题
嘿,我来帮你搞定这个货币兑换计算的问题!核心思路是把CSV里的货币数据预加载成一个**键为货币代码(code)、值为买入价(bid)**的字典,这样就能通过用户选择的货币代码快速查到对应的价格,再完成计算。下面是具体的实现步骤和代码:
1. 预加载CSV数据为字典
首先,我们用Python内置的csv模块读取out.csv文件,把数据转成一个字典。最好在Flask app启动时就加载一次,避免每次请求都重复读文件(虽然你的文件很小,但这是更高效的做法)。
from flask import Flask, render_template, redirect, request import csv app = Flask(__name__) # 全局加载货币数据字典 currency_rates = {} with open('out.csv', mode='r', encoding='utf-8') as file: reader = csv.DictReader(file, delimiter=';') # 注意你的CSV是分号分隔的 for row in reader: # 把bid转成浮点数,方便后续计算 currency_rates[row['code']] = float(row['bid'])
2. 修改POST请求逻辑完成计算
接下来,在kantor路由的POST分支里,我们从表单获取用户输入的金额和货币代码,然后从字典中取出对应的买入价,完成乘法计算。同时要处理一些异常情况(比如用户输入非数字金额、选择了不存在的货币代码):
@app.route('/', methods=['GET', 'POST']) def kantor(): if request.method == 'GET': # 可以把货币列表传递给前端,方便生成下拉选项(可选优化) currencies = list(currency_rates.keys()) return render_template('kantor.html', currencies=currencies) elif request.method == 'POST': try: waluta = request.form['waluta'] amount = float(request.form['amount']) # 检查货币代码是否存在于字典中 if waluta not in currency_rates: return render_template('wynik.html', error="所选货币不存在") # 计算兑换金额 bid_rate = currency_rates[waluta] result = amount * bid_rate # 保留两位小数,符合货币展示习惯 formatted_result = round(result, 2) return render_template('wynik.html', amount=amount, waluta=waluta, result=formatted_result) except ValueError: # 处理用户输入非数字金额的情况 return render_template('wynik.html', error="请输入有效的数字金额")
3. 前端模板(wynik.html)展示结果
在wynik.html里,你可以这样展示计算结果或错误提示:
<!DOCTYPE html> <html> <head> <title>兑换结果</title> </head> <body> {% if error %} <p style="color: red;">{{ error }}</p> {% else %} <p>{{ amount }} {{ waluta }} 可兑换 {{ result }} PLN</p> {% endif %} <a href="/">返回兑换页面</a> </body> </html>
额外优化建议
- 前端表单的货币选择下拉框,可以用我们传递的
currencies列表动态生成,避免手动写选项:
在kantor.html里:<select name="waluta"> {% for code in currencies %} <option value="{{ code }}">{{ code }}</option> {% endfor %} </select> - 如果你的CSV文件可能会更新,可以考虑添加一个定时刷新字典的逻辑,或者在需要时重新读取文件。
内容的提问来源于stack exchange,提问作者user17351627
相关产品推荐
相关产品推荐

