2017-07-10 13 views
0

私はフラスコ、パイソン、ajax、json、javascript、およびチラシを使用しているアプリケーションを持っています。このアプリはcsvファイルを読み込んでjson形式にして、それをajax呼び出しに返します。私の問題はgeojsonが返されていないということです。コンソールでは、コンソールログに5000 NetworkErrorが表示されています。最終的な結果は、リーフレットの地図レイヤーでreturn geojsonを使用することです。もし私がjsonifyを取り除くと、戻り値はうまくいきますが、それはもちろん文字列であり、これはレイヤーでは機能しません。Jsonifyデータがajaxコールに返されない

ご覧のとおり、私はajaxの成功の部分に簡単なアラート(「成功」)があります。これは実行されていません。警告(データ)もありません。 私はFlaskインポートステートメントからjsonifyを持っています。私は、私のreturn文からそれをjsonifyを削除した場合、手にデビッドKnipeの情報を取る - は、ヘルプ

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) 

詳細をありがとう私が期待しているものを返し、私はアラートでリターンを出力することができます。それが動作します、そして私のポイントは私のマップ

上に表示されます - それは私がデータとAjaxの成功にハードコード、それは、このようなリーフレット層のコードにそれを渡すことを取る場合は、この

{ "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", 

あなたはまた、jsonify

+0

ありがとうloganbertram。欠落していた見積もりは私の誤植でした。コードをコピー/ペーストできません。私はここでそれを修正した。 –

0
のためのAPIドキュメントを確認することをお勧めします

JSONを解析しようとしないとうまくいくが、そうした場合は失敗する。あなたのJSONが無効です:loganbertramが指摘したように、あなたは"Feature Collection""を逃している

  • "properties""がありません。
  • output = template % ...output += template % ...である必要があります。outputに追加していますが、置き換えられません。
  • features配列の末尾にカンマが付きます(空でない場合を除きます)。

実際にあなたのコードにfeaturesは常にとにかく空になりますが:その値を変更することはありません、あなたはiter = 0を設定し、iter < 2ので、その後output = ...ビットをしません。

実際にjsonifyを使用しますか?私が理解しているように、これはオブジェクトをJSON文字列に変換します。しかし、outputは既にJSON文字列です。もしあなたがさまざまなバグを修正してloganbertramを見つけたら、私はそれを見つけました。その場合、クライアントサイドのコードはJSONを解析しようとして失敗することはありません。 Javascriptを、代わりにJSONオブジェクトの、オリジナルのJSON文字列に戻って変換されます

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

:あなたすでにJSONだjsonify何かなら、あなたはこのような何かを得るでしょう。

実際には、文字列の代わりにオブジェクトを構成するように全体を書き換えて、そのオブジェクトに対してjsonifyを呼び出してください。しかし、私は詳細を簡単に与えるために十分なPythonを知らない。

+0

ああ、最後に余分な '}'が必要です。 ';'を取り除くと、それは有効なJSONではありません。 –

+0

ありがとうございます。申し訳ありませんが、私が修正したStack Postにはいくつかのタイプミスがありました。私はあなたがJSON文字列について述べた内容を調べました。私はそれをjsonifyしていない場合、出力を警告し、過去の(ハードコード)出力をjavascriptにコピーし、それは動作します。渡されたデータ(ハードコードなし)を取得すると、無効なGeojsonオブジェクトが取得されます。私はリーフレットのポイントレイヤーとしてデータを使用しています。私はそれが同じデータであると信じるとき、なぜ、1つは動作し、もう1つは動作しません。配達はすべて異なっている。私はこれが理にかなってほしい。 –

+0

'features'配列の末尾には末尾にカンマがあります。それは有効なJSONではありません。しかし、それはJSONではないので、JavaScriptコードにハードコードするときに機能します。これはjavascriptです。 (私の最後の段落で推奨された分かりやすい方法を使ってやり直さないように指示されていたなら、これを行う方法は、テンプレートの末尾に '、'を付ける代わりに、最初の繰り返しでは '' ''に置き換えられ、その後は''、 ''で置き換えられます。例えば。 'separator = '''、ループ内( 'output + = ...'の後) 'separator = '、'' –

関連する問題