我有一个应用程序,我使用flask,python,ajax,json,javascript和传单。这个应用程序读取一个csv文件,将其放入json格式,然后将其返回到ajax调用。我的问题是没有返回geojson。在控制台中,我在控制台日志中收到5000 NetworkError。最终结果是在传单地图图层中使用返回geojson。如果我删除jsonify,返回工作正常,但它是一个字符串当然,这不适用于该层。
正如您所看到的,我在ajax成功部分中有一个简单的警报(“成功”)。这没有被执行。警报(数据)也不是。 我在Flask import语句中有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(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( ...
答案 0 :(得分:0)
因此,如果您不尝试解析JSON,它会起作用,但如果您这样做,则会失败。您的JSON无效:
"
上错过了"Feature Collection"
。"
上的"properties"
。output = template % ...
应为output += template % ...
- 您正在追加output
,而不是替换它。features
数组将有一个尾随逗号(除非它是空的)。虽然实际上代码中features
仍然是空的:你设置iter = 0
,永远不会改变它的值,然后不要执行output = ...
位,因为{{1} }。
您确定要确实使用iter < 2
吗?据我了解,它将任何对象转换为JSON字符串。但是jsonify
已经是一个JSON字符串 - 或者应该是,如果你修复了各种错误loganbertram并且我已经发现了。在这种情况下,客户端代码不会尝试解析JSON。但如果你output
已经是JSON的东西,你会得到这样的东西:
jsonify
然后javascript将转换回原始的JSON字符串,而不是JSON对象。
实际上,重写整个事情会更好,因此它构造一个对象而不是一个字符串,然后在该对象上调用"{\"type\" : \"Feature\",
\"geometry\" : {
...
。但我不知道足够多的Python可以轻松提供更多细节。