2017-07-10 63 views
0

我有一個應用程序,我使用的是燒瓶,python,ajax,json,javascript和傳單。這個應用程序讀取一個csv文件,將其放入json格式,然後將其返回給ajax調用。我的問題是,geojson沒有被返回。在控制檯中,我在控制檯日誌中收到5000 NetworkError。最終結果是在傳單地圖圖層中使用返回geojson。如果我刪除jsonify,返回工作正常,但它是一串當然,這不會爲圖層工作。如你所見,我在ajax成功部分有一個簡單的警告(「成功」)。這沒有被執行。警報(數據)也不是。 我在Flask import語句中有jsonify。 謝謝你的幫助Jsonify數據不會返回到Ajax調用

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) 

更多信息 - 以大衛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"} 
      }, 
]} 

如果我採取這一數據,並將其硬編碼到阿賈克斯成功,然後將它傳遞給這樣的瓣葉層的代碼 - 它會工作,我的積分將在我的地圖

顯示
... 
.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

是'request.form ['chks']'正確填充 – Busturdust

+0

@Busturdust - 是的。如果我更改代碼來返回chks,我就能得到我所期望的。另外,如果我刪除jsonify並返回(輸出),我可以得到我所期望的,但是作爲一個字符串。 –

+0

我修復了上面代碼中的一些拼寫錯誤。我希望我能把他們全部帶走。由於安全問題,我無法複製過去我的代碼。這就是錯別字在那裏的原因。 –

回答

0

被返回,而不是您的數據500錯誤,這意味着瓶是無法處理您的請求。這聽起來像你的問題是你使用jsonify,所以檢查瓶錯誤日誌。您可能還想在每次更改時打印輸出,以查看您的格式是否適合jsonify。

關閉我的頭頂,它看起來像這樣一行:

{"type" : Feature Collection", 

缺少報價:

{"type" : "Feature Collection", 

您還可以查看API文檔爲jsonify

+0

謝謝loganbertram。缺少的報價是我的一個錯字。我無法複製/粘貼我的代碼。我在這裏修復它。 –

0

因此,如果你不嘗試解析JSON,它會起作用,但如果你這樣做,那麼它會失敗。您的JSON是無效的:

  • 作爲loganbertram指出的那樣,你錯過了上"Feature Collection"一個"
  • 您錯過了"關於"properties"
  • output = template % ...應該是output += template % ... - 您追加到output,而不是取代它。
  • features數組將有一個尾隨逗號(除非它爲空)。

雖然實際上在你的代碼features將永遠是空的呢:你設置iter = 0,永遠不會改變它的值,然後不做output = ...位,因爲iter < 2

您是否確定要使用jsonify?據我瞭解,這將任何對象變成一個JSON字符串。但output已經是JSON字符串 - 或者應該是,如果你修復了loganbertram和我發現的各種bug。在這種情況下,客戶端代碼不會嘗試解析JSON。但是,如果你jsonify東西是已經JSON,你會得到這樣的事情:

"{\"type\" : \"Feature\", 
    \"geometry\" : { 
... 

它的JavaScript會再轉換回原來的JSON字符串,而不是一個JSON對象。

實際上,最好重寫整個事物,以便構造一個對象而不是字符串,然後在該對象上調用jsonify。但是我不知道Python足以輕鬆提供更多細節。

+0

哦,你最後需要一個額外的'}'。並擺脫';',這不是有效的JSON。 –

+0

謝謝你的迴應。對不起,但我的堆棧文章中有幾個拼寫錯誤,我已修復。我研究了你對JSON字符串的看法。如果我沒有對它進行json化,請提醒輸出,然後將輸出(硬編碼)輸出複製到javascript中,它可以工作。如果我接收傳遞的數據(無硬編碼),則會得到一個無效的Geojson對象。我將這些數據用作傳單中的一個點層。當我相信它是相同的數據時,爲什麼一個工作而另一個不工作?交付是完全不同的。我希望這是有道理的。 –

+0

'features'數組末尾仍然有尾隨逗號。這不是有效的JSON。但是,當你將它硬編碼到JavaScript代碼中時,它會起作用,因爲它不是JSON,而是JavaScript。 (Javascript允許拖尾逗號。)我會這樣做的方式(如果我已經被命令不使用我在最後一段中推薦的明智方法重做它)將不會在模板中有尾隨','在模板中有一個前導'%s',在第一次迭代時被''''替換,之後是'',''。例如。 'separator =''',然後在循環中(在'output + = ...')'separator =',''之後。 –