Python 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成功部分中有一个简单的警告(“成功”)。这不是在执行。警报(数据

我有一个应用程序,我正在使用flask、python、ajax、json、javascript和传单。此应用程序读取csv文件,将其转换为json格式,然后将其返回到ajax调用。我的问题是没有返回geojson。在控制台中,我在控制台日志中得到一个5000 NetworkError。最终结果是在传单映射层中使用返回geojson。如果我删除jsonify,返回的效果很好,但它当然是一个字符串,这对层不起作用

如您所见,我在ajax成功部分中有一个简单的警告(“成功”)。这不是在执行。警报(数据)也是如此。 我在from 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中,然后像这样将其传递到传单层代码-它会工作,我的点会显示在我的地图上

...
.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
,因此它仍然在添加逗号。我建议的方法不太容易出错:编写第一个特性时不使用逗号,后续行的开头(而不是结尾)使用逗号。然后,您不必读取文件两次来计算行数。