2012-02-20 13 views
5
@route('/locations', method='GET') 
def get_location(): 
    entity = db['locations'].find({'coordinate2d': {'$near': [37.871593, -122.272747]}}).limit(3) 
    if not entity: 
     abort(404, 'No nearby locations') 
    return entity 

コードの上記部分の応答がある:パイソン/ボトル/ MongoDBの:サポートされていない応答タイプ:<type 'dict'>

Error 500: Internal Server Error 

Sorry, the requested URL 'http://localhost:8080/locations' caused an error: 

Unsupported response type: <type 'dict'> 

がどのように型ボトルとしてMongoのからの情報はJSONとして返すことができることをつかむことができます?

+0

問題を分解しようとしましたか?つまり、単純な辞書リテラルで 'db.find'呼び出しを置き換えましたか?それがそのように働くなら、問題はMongo関連でなければならない。ボトル関連ではありませんか? – Helgi

+0

@Helgi私は持っていますが、もちろんボトルは通常の辞書リテラルで動作します。 MongoDB ObjectIdは扱えません。 –

答えて

2

完全な溶液が生成し、私の場合、戻り値

@route('/locations/:lat/:lng', method='GET') 
def get_location(lat,lng): 
    response.content_type = 'application/json' 
    objdb = db.locations.find({'coordinate2d': {'$near': [lat,lng]}}, {'coordinate2d':bool(1)}).skip(0).limit(3) 
    entries = [entry for entry in objdb] 
    return MongoEncoder().encode(entries) 

を手動でリストにDBカーソルを変換する応答タイプを設定+カスタムコードを組み合わせましたこれは

[ 
    { 
     "_id": "4f4201bb7e720d1dca000005", 
     "coordinate2d": [ 
      33.0000006, 
      -117.19483074631853 
     ] 
    }, 
    { 
     "_id": "4f4201587e720d1dca000002", 
     "coordinate2d": [ 
      33.158092999999994, 
      -117.350594 
     ] 
    }, 
    { 
     "_id": "4f42018b7e720d1dca000003", 
     "coordinate2d": [ 
      33.195870000000006, 
      -117.379483 
     ] 
    } 
] 
+0

これは大きな助けとなりました。私は同様の問題に遭遇していましたが、MongoEncoderがどこから来たのか分からなかったので問題がありました。 ** – Hectron

1

瓶の説明によると、http://bottlepy.org/docs/dev/の文章では、@routeデコレータから文字列を返す必要があります。データまたは文字列を含むテンプレートを返す必要があります。

jsonを生成する場合は、Content-Typeを変更する必要があります。

Dictionaries

As mentioned above, Python dictionaries (or subclasses thereof) are automatically transformed into JSON strings and returned to the browser with the Content-Type header set to application/json. This makes it easy to implement json-based APIs. Data formats other than json are supported too. See the tutorial-output-filter to learn more.

http://bottlepy.org/docs/dev/tutorial.html?highlight=json#generating-content

+0

辞書を返していて、Bottleからエラーが返されます。 サポートされていない応答の種類: また、@routeから文字列を返すことで違いはありません。 –

+0

コンテンツタイプを設定しましたか? – Nilesh

+0

エラー設定があります。content-typeはエラーHTMLをプレーンテキストとして出力するだけです。問題は、Mongoで地理空間を使用していることです。ボトルのドキュメントはそれをカバーしていません。 –

0

私がtrだったときにこのエラーが発生しましたPythonリストを返すようにしてください。私はそれがJSONに変換されると仮定しましたが、そうはしませんでした。これは、iterablesを処理し、リストの最初のdictを見つけ、上記のエラーを投げたbottle.pyの行に出力されました。

これを回避するために、私は単純にディクテーション内に自分のリストを埋め込んだ。

return {'response': []} 
+0

これは意図的なものです。詳細については、この質問と回答をご覧ください:http://stackoverflow.com/questions/12293979/how-do-i-return-a-json-array-with-bottle – Peter

関連する問題