版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/hgyan25/article/details/82828747
问题描述
最近(项目的web框架选用flask)遇到一个问题,描述如下:
- 从view函数中获得一个全局变量,hosts。类型为列表内嵌dict。
例如
hosts{
host1{ip, mac, id…},
host2{ip, mac, id…},
host3{ip, mac, id…}
} - 前端界面用户通过一个下拉框来选择某一个host(html中的for循环来展示所有的host)
- 然后点击一个按钮要将这个host的信息传送到view函数中(JavaScript中获得下拉框选择的值)
解决方案
然后我想到了两种方案,最终解决了我的问题:
- 构造某个链接,传host_id,其实简单来说就是GET请求。
url_for
函数中要求传入参数的是常量。但是我们通过JavaScript中获取的时候势必是一个变量的形式储存host_id。无法通过url_for构造链接。{{url_for(“xxx”), host_id=常量}}。 - 把数据放到json中,发送POST请求
另一种方法就是将获取的数据放到json中,通过ajax发送POST请求。- 这个过程中遇到的一个报错是
$ is undefine
出现这个原因是因为jquery没有引入或者引入的顺序不对。$
其实是jquery的代称。然后我重新看回自己写的代码,引入jquery文件的部分是在layout.html文件里,在我改的html文件中是需要继承了(extends)layout.html。要用到super{{}}函数,继承layout.html的scripts。
- 这个过程中遇到的一个报错是
代码
这里附上相关的前端javascript和后端python的代码。
// 此段代码是放置在一个按钮的click函数中
var infos = {
"mode" : "neutron",
"ipaddr": "127.0.0.1",
"hostname": "jane"
};//需要传送的json值
$.ajax({
type : "POST",
url : '{{ url_for('cluster.deploy')}}',//对应的URL链接
data : JSON.stringify(infos),#将数据转换
contentType : "application/json; charset=UTF-8",//这里比较重要,写明application/json,否则无法识别
dataType: 'json',
success : function(results){//成功发送POST请求,并收到反馈之后的处理
alert(JSON.stringify)
},
error : function(xhr, type){
alert("发送POST请求失败"+ xhr + type );
}
});
@cluster_bp.route('/deploy', methods=['POST'])
def deploy():
infos = request.get_json()# 需要引入request变量 from flask import request
ipaddr = infos['ipaddr']# 通过键值对来获取需要的变量值
hostname = infos['hostname']
results['status']="success"
return jsonify(results)# 返回反馈到html中
区别
POST和GET区别
两者都是HTTP网络请求的方式
从四个方面来进行对比
- 效率 GET是[得],从服务器获取数据,效率较快,POST是[给],向服务器发送数据并下载数据,效率较慢
- 缓存,GET请求可以被缓存,默认的请求方式也是有缓存的,POST请求默认不缓存
- 安全性:GET请求把所有的参数都放到url中,明文显示,且服务器的日志会记录;POST请求只有资源路径,参数封装到二进制的数据体中,服务器不会记录参数,相对安全,但还是可以抓包分析
- 数据量,http协议对他们的请求大小没有限制,但实际应用中,GET能承载的数据量小于POST