Jsonify数据未返回到ajax调用

时间:2017-07-10 16:21:51

标签: python ajax flask leaflet geojson

我有一个应用程序,我使用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( ...

1 个答案:

答案 0 :(得分:0)

因此,如果您不尝试解析JSON,它会起作用,但如果您这样做,则会失败。您的JSON无效:

  • 正如loganbertram指出的那样,你在"上错过了"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可以轻松提供更多细节。