【Python】【Flask】【字符串索引】计算人民币与美元的相互计算
简介
假设1美元等于7.0183人民币,1人民币等于0.1424美元,设计与编写解决"人民币与美元相互兑换"这-问题的程序。( 美元或者人民币采用输入的方式,输入的值为自己学号
后三位,必须在运行截图中体现出来!也可设计一一个界面,界面不做要求)
提交要求:
(1)共两个文件;
(2)第一个文件为.py文件;
(3)第二个文件学号+姓名+货币兑换word; .
(4)其中word文件中包含:程序代码截图、程序运行输入与结果截图
【本文要点】
1.本文前端使用HTML+CSS+JavaScript,后端采用Python Flask框架,实现计算人民币与美元的换算。
2.前端使用原生JS的方式向后端提交数据
本文的关键在于
1、如何使用原生JS向后端POST提交数据
2、Python Flask框架的简单使用(获取数据,返回数据)
Python Code
导包
from flask import Flask
from flask import request # 获取数据
from flask_cors import CORS # 解决跨域问题
app = Flask(__name__)
CORS(app, resources={r"/*": {"origins": "*"}}) # 解决跨域问题
设置首页
这里的代码不用细看,你只需要知道
@app.route("/",methods=["GET"])
设置首页就可以了。前端代码我们会在后面分析的。
@app.route("/",methods=["GET"])
def main():
return r"""
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<form onclick="return false">
<h2>汇率计算</h2>
<label for="number">待计算金额</label>
<input type="number" id="number">
<label>
<select id="select_type">
<option>CNY</option>
<option>USD</option>
</select>
</label>
<input type="submit" value="计算" onclick="calc()">
<p id="result"></p>
<script>
function calc() {
//创建XMLHttpRequest对象
let obj
if (window.XMLHttpRequest) {
//IE7以上
obj = new XMLHttpRequest();
} else {
//IE5、IE6
obj = new ActiveXObject("Microsoft,XMLHTTP")
}
//规定请求类型,请求路径,是否异步
obj.open("POST", "/calc", true)
//发送请求
let s = document.getElementById("select_type")
let i = s.selectedIndex
let v_2 = s.options[i].value
let v_1 = document.getElementById("number").value
let v = v_1 + v_2
let value = "value=" + v
obj.setRequestHeader("Content-type", "application/x-www-form-urlencoded"); // 设置请求头
obj.send(value)
//请求完成后的处理
obj.onreadystatechange = function (data) {
console.log("data:",data)
if (obj.readyState === 4 && obj.status === 200) {
//responseText:获取字符串形式的响应数据;responseXML:获取XML形式的响应数据
txt = obj.responseText
console.log(txt)
//JSON.parse();JSON字符串转化为JS对象;JSON.stringify():JS转为JSON字符串
let r = JSON.parse(txt)
//调用对象内的属性回填数据
document.getElementById("result").innerText=r["result"]+(r["type"]==="CNY"?"USD":"CNY")
}else{
console.log("获取返回数据失败")
}
}
}
</script>
</form>
</body>
</html> """
你可能会好奇为什么我设置了跨域,但是页面却不是分来的。
实际上我调试的时候,前端是单独的页面,而不是写在Python里面的。
所以其实你可以这样:
首页你就 return "hello word"
然后前端不管写在哪都行,只要Post地址正确就行。
计算的接口
@app.route("/calc",methods=["POST","GET"])
def calc():
result=0
value =request.values.get("value")
print(value)
if value=="":
result=-1
print("【INFO】", "用户输入", value)
type = value[-3::1].upper()
print("【INFO】", "类型为", type)
try:
number = int(value[:-3])
print("【INFO】", "金额为", number)
except:
return -1
if type == "CNY":
# 表示输入的人民币,需要计算为美元
result=number * 0.1424
elif type == "USD":
# 表示输入的美元,需要计算为人民币
result=number / 0.1424
print("【INFO】", "结果为",result)
return {"result": result, "type": type}
这是最关键的地方,事实上代码并不多,只是我写的注释多。
我们要确认的是得到的参数格式是“1CNY”或者“1USD”这样的。当然,如果你不是这个格式,也可以,分析数据的时候改动一下就可以了。
就以我的格式为例,数据+单位的格式
我们得到的是一整个字符串,就要拆分数据和单位,就可以通过单位判断是美元转人民币还是人民币转美元。
观察可知,单位都是三个字符,所以:
value[-3::1]
来取出字符。-3就是从倒数第三个开始取,两个冒号中间是空的,啥也没写,代表取到结束为止,最后那个1代表的是步长为1。1,2,3 步长为1
2,4,6步长为2
这你懂步长的意思了吧
再通过
.upper()
的方式将单位转为大写方便判断(考虑的是用户输入的可能是大写,有可能是小写)这些都是Python基础,就在这里简单提一下。
问题0:设置请求方式
如果想要接收POST请求,需要设置请求方法支持POST
@app.route("/calc",methods=["POST","GET"])
我这样设置的是POST和GET请求都支持。关于这个地方,你只需知道methods需要的值是一个列表就行了
问题1:关于接收数据可能存在的问题
情况:print(request.data)
存在数据,但是 value =request.values.get("value")取不到数据。
错误:状态码500
原因:无法识别前端传来的数据
解决方案:前端传来数据时声明数据类型。例如
obj.setRequestHeader("Content-type", "application/x-www-form-urlencoded"); // 设置请求头
这是我在写的过程中遇到的问题,要强调的是“前端传数据过来时,一定要在头部声明数据类型”
Python Flask接受参数的方法有很多,你可以参考这篇文章:
Flask 1.1.2:request中存储参数的属性(form、args、data、json、files、values)使用简介_mola tutu的博客-CSDN博客_request.values
另外,要进行金额换算,换算什么的,加减乘除啊,都是数值在相互加减乘除,而我们拿到的是字符串
所以要将字符串转型。如果你前端不去限制数值类型,传过来的不是个数字,字符串转为数值类型的时候就会发生错误,所以要使用异常处理try。
问题2:返回结果
返回的结果要符合JSON格式。也就是你要返回的是Python字典,而不是单纯的一个数字,一个字符串。
return {"result": result, "type": type}
启动
if __name__ == '__main__':
app.run()
完整代码
# -*- coding: UTF-8 -*-
# 开发人员:萌狼蓝天
# 博客:Https://mllt.cc
# 笔记:Https://cnblogs.com/mllt
# 哔哩哔哩/微信公众号:萌狼蓝天
# 开发时间:2022/9/26
import json
from flask import Flask
from flask import request
from flask_cors import CORS
app = Flask(__name__)
CORS(app, resources={r"/*": {"origins": "*"}})
@app.route("/calc",methods=["POST","GET"])
def calc():
result=0
value =request.values.get("value")
print(value)
if value=="":
result=-1
print("【INFO】", "用户输入", value)
type = value[-3::1].upper()
print("【INFO】", "类型为", type)
try:
number = int(value[:-3])
print("【INFO】", "金额为", number)
except:
return -1
if type == "CNY":
# 表示输入的人民币,需要计算为美元
result=number * 0.1424
elif type == "USD":
# 表示输入的美元,需要计算为人民币
result=number / 0.1424
print("【INFO】", "结果为",result)
return {"result": result, "type": type}
@app.route("/",methods=["GET"])
def main():
return r"""
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<form onclick="return false">
<h2>汇率计算</h2>
<label for="number">待计算金额</label>
<input type="number" id="number">
<label>
<select id="select_type">
<option>CNY</option>
<option>USD</option>
</select>
</label>
<input type="submit" value="计算" onclick="calc()">
<p id="result"></p>
<script>
function calc() {
//创建XMLHttpRequest对象
let obj
if (window.XMLHttpRequest) {
//IE7以上
obj = new XMLHttpRequest();
} else {
//IE5、IE6
obj = new ActiveXObject("Microsoft,XMLHTTP")
}
//规定请求类型,请求路径,是否异步
obj.open("POST", "/calc", true)
//发送请求
let s = document.getElementById("select_type")
let i = s.selectedIndex
let v_2 = s.options[i].value
let v_1 = document.getElementById("number").value
let v = v_1 + v_2
let value = "value=" + v
obj.setRequestHeader("Content-type", "application/x-www-form-urlencoded"); // 设置请求头
obj.send(value)
//请求完成后的处理
obj.onreadystatechange = function (data) {
console.log("data:",data)
if (obj.readyState === 4 && obj.status === 200) {
//responseText:获取字符串形式的响应数据;responseXML:获取XML形式的响应数据
txt = obj.responseText
console.log(txt)
//JSON.parse();JSON字符串转化为JS对象;JSON.stringify():JS转为JSON字符串
let r = JSON.parse(txt)
//调用对象内的属性回填数据
document.getElementById("result").innerText=r["result"]+(r["type"]==="CNY"?"USD":"CNY")
}else{
console.log("获取返回数据失败")
}
}
}
</script>
</form>
</body>
</html> """
if __name__ == '__main__':
app.run()
HTML Code
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<form onclick="return false">
<h2>汇率计算</h2>
<label for="number">待计算金额</label>
<input type="number" id="number">
<label>
<select id="select_type">
<option>CNY</option>
<option>USD</option>
</select>
</label>
<input type="submit" value="计算" onclick="calc()">
<p id="result"></p>
<script>
function calc() {
//创建XMLHttpRequest对象
let obj
if (window.XMLHttpRequest) {
//IE7以上
obj = new XMLHttpRequest();
} else {
//IE5、IE6
obj = new ActiveXObject("Microsoft,XMLHTTP")
}
//规定请求类型,请求路径,是否异步
obj.open("POST", "http://127.0.0.1:5000/calc", true)
//发送请求
let s = document.getElementById("select_type")
let i = s.selectedIndex
let v_2 = s.options[i].value
let v_1 = document.getElementById("number").value
let v = v_1 + v_2
let value = "value=" + v
obj.setRequestHeader("Content-type", "application/x-www-form-urlencoded"); // 设置请求头
obj.send(value)
//请求完成后的处理
obj.onreadystatechange = function (data) {
console.log("data:",data)
if (obj.readyState === 4 && obj.status === 200) {
//responseText:获取字符串形式的响应数据;responseXML:获取XML形式的响应数据
txt = obj.responseText
console.log(txt)
//JSON.parse();JSON字符串转化为JS对象;JSON.stringify():JS转为JSON字符串
let r = JSON.parse(txt)
//调用对象内的属性回填数据
document.getElementById("result").innerText=r["result"]+(r["type"]==="CNY"?"USD":"CNY")
}else{
console.log("获取返回数据失败")
}
}
}
</script>
</form>
</body>
</html>
问题分析
分析:获取下拉列表框的选中值
let s = document.getElementById("select_type") //获取到下拉列表框元素对象
let i = s.selectedIndex //获取当先被选中值的索引
let v_2 = s.options[i].value //根据索引获取值
let v_1 = document.getElementById("number").value //获取文本框元素的值
let v = v_1 + v_2 //将两个值以字符串的形式拼接起来
let value = "value=" + v //写成后端可以识别的格式,多条数据使用&隔开
分析:将计算后的数据显示出来
document.getElementById("result").innerText=r["result"]+(r["type"]==="CNY"?"USD":"CNY")
我们获取了数据之后,得到的是计算好的值,还有它计算出来 我们传给它的钱钱类型
值可以直接用,但是钱钱类型
你想一下,我们传给他的是人民币CNY,它分析之后,告诉我们是钱钱类型是CNY,而计算出来的钱钱类型是USD
所以我们获得CNY,就要转为USD;获得USD,就转为CNY
这里运用了三目运算符的写法
r["type"]==="CNY"?"USD":"CNY"
Some bugs
因为只是个作业,代码写的比较水。有几个地方可以继续优化一下
1.前端限制输入必须是数值,而不是字母汉字特殊字符等乱七八糟的
2.后端字符串转为数值时,不应该是转为int型,万一人家输入的有小数你对吧?
更新后的代码
1.前端传入为空时处理
2.数据类型使用Decimal
3.修改了汇率错误的问题
# -*- coding: UTF-8 -*-
# 开发人员:萌狼蓝天
# 博客:Https://mllt.cc
# 笔记:Https://cnblogs.com/mllt
# 哔哩哔哩/微信公众号:萌狼蓝天
# 开发时间:2022/9/26
from flask import Flask
from flask import request
from flask_cors import CORS
from decimal import Decimal
app = Flask(__name__)
CORS(app, resources={r"/*": {"origins": "*"}})
@app.route("/calc",methods=["POST","GET"])
def calc():
result=0
value =request.values.get("value")
print(value)
if value=="":
result=-1
print("【INFO】", "用户输入", value)
type = value[-3::1].upper()
print("【INFO】", "类型为", type)
try:
number = Decimal(value[:-3])
print("【INFO】", "金额为", number)
except:
return -1
if type == "CNY":
# 表示输入的人民币,需要计算为美元
result=number * Decimal("0.1424")
elif type == "USD":
# 表示输入的美元,需要计算为人民币
result=number * Decimal("7.0183")
print("【INFO】", "结果为",result)
return {"result": result, "type": type}
@app.route("/",methods=["GET"])
def main():
return r"""
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<form onclick="return false">
<h2>汇率计算</h2>
<label for="number">待计算金额</label>
<input type="number" id="number">
<label>
<select id="select_type">
<option>CNY</option>
<option>USD</option>
</select>
</label>
<input type="submit" value="计算" onclick="calc()">
<p id="result"></p>
<script>
function calc() {
//创建XMLHttpRequest对象
let obj
if (window.XMLHttpRequest) {
//IE7以上
obj = new XMLHttpRequest();
} else {
//IE5、IE6
obj = new ActiveXObject("Microsoft,XMLHTTP")
}
//规定请求类型,请求路径,是否异步
obj.open("POST", "http://127.0.0.1:5000/calc", true)
//发送请求
let s = document.getElementById("select_type")
let i = s.selectedIndex
let v_2 = s.options[i].value
let v_1 = document.getElementById("number").value
if(v_1==="" || v_1===null){
v_1="0"
}
let v = v_1 + v_2
let value = "value=" + v
obj.setRequestHeader("Content-type", "application/x-www-form-urlencoded"); // 设置请求头
obj.send(value)
//请求完成后的处理
obj.onreadystatechange = function (data) {
console.log("data:",data)
if (obj.readyState === 4 && obj.status === 200) {
//responseText:获取字符串形式的响应数据;responseXML:获取XML形式的响应数据
txt = obj.responseText
console.log(txt)
//JSON.parse();JSON字符串转化为JS对象;JSON.stringify():JS转为JSON字符串
let r = JSON.parse(txt)
//调用对象内的属性回填数据
document.getElementById("result").innerText=r["result"]+(r["type"]==="CNY"?"USD":"CNY")
}else{
console.log("获取返回数据失败")
}
}
}
</script>
</form>
</body>
</html>
"""
if __name__ == '__main__':
app.run()
【Python】【Flask】【字符串索引】计算人民币与美元的相互计算的更多相关文章
- 初学Python之 字符串 索引 分片
字符串是字符的有序集合,可以通过其位置来获得具体的元素. 在python中,字符串中的字符是通过索引来提取的,索引从0开始. python可以取负值,表示从末尾提取,最后一个为-1,倒数第二个为-2, ...
- 【Python 08】汇率兑换2.0-1(字符串索引)
1.案例描述 设计一个汇率换算程序,其功能是将人民币转换为美元,或者美元转换为人民币. 增加功能:根据输入判断是人民币还是美元,进行相应的转换计算. 2.案例分析 3.字符串 两个双引号或单引号括起 ...
- Python之字符串计算(计算器)
Python之字符串计算(计算器) import re expression = '-1-2*((60+2*(-3-40.0+42425/5)*(9-2*5/3+357/553/3*99/4*2998 ...
- python基础之字符串索引与切片
字符串索引与切片:切片后组成新字符串与原字符串无关系增:str1+str2查:str1[index] str1[start_index:end_index]1,索引从0开始2,根据索引获取元素:索引超 ...
- Python 字符串索引、切片、修改
字符串索引.切片.修改1.字符串操作(切片.修改)应用场景 a.爬虫截取网址数据 b.数据分析,语言处理(分词) c.电信号码升级 0452 8869504 ...
- Python格式化字符串~转
Python格式化字符串 在编写程序的过程中,经常需要进行格式化输出,每次用每次查.干脆就在这里整理一下,以便索引. 格式化操作符(%) "%"是Python风格的字符串格式化操作 ...
- Python格式化字符串
在编写程序的过程中,经常需要进行格式化输出,每次用每次查.干脆就在这里整理一下,以便索引. 格式化操作符(%) "%"是Python风格的字符串格式化操作符,非常类似C语言里的pr ...
- Python中字符串的使用
这篇文章主要介绍python当中用的非常多的一种内置类型——str.它属于python中的Sequnce Type(序列类型).python中一共7种序列类型,分别为str(字符串),unicode( ...
- Python基础——字符串
Python版本:3.6.2 操作系统:Windows 作者:SmallWZQ 在Python中,字符串也是一种数据类型.相比其它数据类型,字符串算是比较复杂的.为何呢?因为字符串不仅包含英文字母 ...
- python中字符串的操作方法
python中字符串的操作方法大全 更新时间:2018年06月03日 10:08:51 作者:骏马金龙 我要评论这篇文章主要给大家介绍了关于python中字符串操作方法的相关资料,文中通过示例代码详细 ...
随机推荐
- 2022年2月国产数据库排行榜:冠军宝座面临挑战,OceanBase 重返 TOP3
大家好!文章开始本是用"新春快乐!虎年吉祥!"和大家打个招呼,无奈时间过得太快而文章整理得很慢,眼看崭新的三月还有几天就到来,那就在这里祝屏幕前的你在三月比二月更优秀! 月初,20 ...
- 1.flask 源码解析:简介
目录 一.flask 源码解析:简介 1.1 flask 简介 1.2 两个依赖 1.2.1 werkzeug 1.2.2 Jinja2 1.3 如何读代码 Flask 源码分析完整教程目录:http ...
- Android复习(五)设备兼容—>多apk支持
1. 对于不同的屏幕发布单独的apk https://developer.android.google.cn/training/multiple-apks/screensize 2.多窗口模式 在An ...
- 使用Pydantic和SqlAlchemy实现树形列表数据(自引用表关系)的处理,以及递归方式处理数据差异
在我的设计框架业务中,字典大类.部门机构.系统菜单等这些表,都存在id.pid的字段,主要是作为自引用关系,实现树形列表数据的处理的,因为这样可以实现无限层级的树形列表.在实际使用Pydantic和S ...
- KubeSphere 社区双周报 | FluentBit 新增 tcp 输入插件 | 2023.09.29-10.12
KubeSphere 社区双周报主要整理展示新增的贡献者名单和证书.新增的讲师证书以及两周内提交过 commit 的贡献者,并对近期重要的 PR 进行解析,同时还包含了线上/线下活动和布道推广等一系列 ...
- Java开发23种设计模式(转)
[转载]https://www.cnblogs.com/maowang1991/archive/2013/04/15/3023236.html 设计模式(Design Patterns) --可复用面 ...
- Shell简单入门程序参考
目录 0 前言 0.1 shell初试 1 程序功能 1.1 显示当前主机名和IP地址. 1.1.1 if 语句 详解 1.2 创建目录或者文件 1.3 修改文件属性 1.3.1 chmod 修改文件 ...
- curl命令详解【转载】
本文转载自curl 的用法指南-阮一峰 简介 curl 是常用的命令行工具,用来请求 Web 服务器.它的名字就是客户端(client)的 URL 工具的意思. 它的功能非常强大,命令行参数多达几十种 ...
- JS 本地存储 localStorage 操作总结
现在前端做数据存储,跨页面传值,localStorage是一个很好的方式,以键值对的方式存储,也方便取值赋值,下面说一说使用方法和一些常见的使用技巧. 1.存值共有3种方式,localStorage相 ...
- 【笔记】 STL容器
[笔记] STL容器 vector vector<int> v; v.push_back(x); v.emplace(x); v.size(); v.erase(v.begin(),v.b ...