Python Jsonify数据不返回到ajax调用
我有一个应用程序,我正在使用flask、python、ajax、json、javascript和传单。此应用程序读取csv文件,将其转换为json格式,然后将其返回到ajax调用。我的问题是没有返回geojson。在控制台中,我在控制台日志中得到一个5000 NetworkError。最终结果是在传单映射层中使用返回geojson。如果我删除jsonify,返回的效果很好,但它当然是一个字符串,这对层不起作用 如您所见,我在ajax成功部分中有一个简单的警告(“成功”)。这不是在执行。警报(数据)也是如此。 我在from Flask import语句中有jsonify。 谢谢你的帮助 Ajax调用Python Jsonify数据不返回到ajax调用,python,ajax,flask,leaflet,geojson,Python,Ajax,Flask,Leaflet,Geojson,我有一个应用程序,我正在使用flask、python、ajax、json、javascript和传单。此应用程序读取csv文件,将其转换为json格式,然后将其返回到ajax调用。我的问题是没有返回geojson。在控制台中,我在控制台日志中得到一个5000 NetworkError。最终结果是在传单映射层中使用返回geojson。如果我删除jsonify,返回的效果很好,但它当然是一个字符串,这对层不起作用 如您所见,我在ajax成功部分中有一个简单的警告(“成功”)。这不是在执行。警报(数据
$.ajax({
type : "POST",
url : '/process',
data: {
chks: chks
}
})
.success(function(data){
alert("success"); // I am doing this just to get see if I get back here. I do not
alert(data);
蟒蛇/烧瓶
@app.route('/process', methods=['POST'])
def process():
data = request.form['chks']
rawData = csv.reader(open('static/csvfile.csv', 'r'), dialect='excel')
count = sum(1 for row in open('static/csvfile.csv))
template =\
''' \
{"type" : "Feature",
"geometry" : {
"type" : "Point",
"coordinates" : [%s, %s]},
"properties" : {"name" : "%s" }
}%s
'''
output = \
''' \
{"type" : "Feature Collection",
"features" : [
'''
iter = 0
separator = ","
lastrow = ""
for row in rawData:
iter += 1 // this is used to skip the first line of the csv file
if iter >=2:
id = row[0]
lat = row[1]
long = row[2]
if iter != count:
output += template % (row[2], row[1], row[0], separator)
else:
output += template % (row[2], row[1], row[0], lastrow)
output += \
''' \
]}
'''
return jsonify(output)
更多信息-掌握David Knipe的信息,如果我从return语句中删除jsonify,它将返回我期望的结果,并且我可以在警报中输出返回结果。看起来像这样
{ "type" : "Feature Collection",
"features" : [
{"type" : "Feature",
"geometry" : {
"type" : "Point",
"coordinates" : [ -86.28, 32.36]},
"properties" : {"name" : "Montgomery"}
},
{ "type" : "Feature",
"geometry" : {
"type" : "Point",
"coordinates" : [ -105.42, 40.30]},
"properties" : {"name" : "Boulder"}
},
]}
如果我将这些数据硬编码到ajax success中,然后像这样将其传递到传单层代码-它会工作,我的点会显示在我的地图上
...
.success(function(data){
var pointsHC= { "type" : "Feature Collection",
"features" : [
{"type" : "Feature",
"geometry" : {
"type" : "Point",
"coordinates" : [ -86.28, 32.36]},
"properties" : {"name" : "Montgomery"}
},
{ "type" : "Feature",
"geometry" : {
"type" : "Point",
"coordinates" : [ -105.42, 40.30]},
"properties" : {"name" : "Boulder"}
},
]};
// leaflet part
var layer = L.geoJson(pointsHC, {
pointToLayer: function(feature, latlng){
return L.circleMarker( ...
如果我没有硬编码并通过变量传递数据,那么它就不起作用,我会得到一个无效的geoJson对象。我试过去掉分号和不去掉分号,两种方式都没有爱情
...
.success(function(data){
// leaflet part
var layer = L.geoJson(data, {
pointToLayer: function(feature, latlng){
return L.circleMarker( ...
因此,如果您不尝试解析JSON,它是有效的,但如果您尝试解析JSON,它就会失败。您的JSON无效:
- 正如loganbertram指出的,您在
中缺少了一个“功能集合”
“
- 您在
上缺少一个“属性”
“
应该是output=template%…
-您将附加到output+=template%…
,而不是替换它output
数组后面将有一个逗号(除非是空的)features
特性
始终是空的:你设置了iter=0
,永远不要改变它的值,然后不做输出=…
位,因为iter<2
确实要使用jsonify
?据我所知,这会将任何对象转换为JSON字符串。但是,output
已经是一个JSON字符串了——或者应该是,如果你修复了loganbertram和我发现的各种错误的话。在这种情况下,客户端代码在尝试解析JSON时不会失败。但是,如果您jsonify
已经是JSON的东西,您将得到如下结果:
"{\"type\" : \"Feature\",
\"geometry\" : {
...
javascript随后将转换回原始JSON字符串,而不是JSON对象
实际上,最好重写整个过程,使其构造一个对象而不是字符串,然后对该对象调用
jsonify
。但我对Python的了解还不够,无法轻易给出更多细节。是request.form['chks']
populated@Busturdust-是的。如果我更改代码以返回chks,我将得到我期望的结果。另外,如果我删除jsonify并只返回(输出),我会得到我期望的结果,但是作为一个字符串。我希望我能把他们都带走。由于安全问题,我无法复制我的代码。这就是为什么会有打字错误。哦,你需要在最后加一个}
。并且去掉代码>,这不是有效的JSON。感谢您的回复。很抱歉,我已经修复了我的堆栈帖子中的几个拼写错误。我研究了您所说的关于JSON字符串的内容。如果我不将其jsonify化,通知输出,然后将过去的(硬代码)输出复制到javascript中,就可以了。如果我获取传递的数据(没有硬代码),我会得到一个无效的Geojson对象。我将数据用作传单中的点图层。既然我相信数据是一样的,为什么一个有效而另一个无效呢。交付方式完全不同。我希望这是有意义的。在features
数组的末尾仍然有逗号。这不是有效的JSON。但是,当您将其硬编码到javascript代码中时,它会起作用,因为它不是JSON,而是javascript。(Javascript允许尾随逗号。)我这样做的方式(如果我被命令不使用我在最后一段中建议的合理方法重做它)是,在模板中不使用尾随的,
,而是在模板中使用一个前导的%s
,在第一次迭代中被'
和'替换,“
之后。例如,separator=''
,然后在循环中(在output+=…
之后)separator='','
。我更改了代码,以便在最后一点上删除尾随逗号。还是没有爱。我仍然不明白为什么数据来自哪里会很重要。硬编码数据是通过函数发送并通过警报输出的数据的复制粘贴。唯一的区别是我加了一个;在硬编码变量的末尾。硬编码变量在传单中起作用。只有当我通过函数传单传递数据时,函数传单才会调用无效的geojson。只是它仍然是javascript,它仍然是一个geojson字符串。它是文件中的行数,包括标题。最后一行在iter==count-1
,因此它仍然在添加逗号。我建议的方法不太容易出错:编写第一个特性时不使用逗号,后续行的开头(而不是结尾)使用逗号。然后,您不必读取文件两次来计算行数。