2010-08-17 11 views
24

Wie gehe ich über das Zurückbringen von Json-Daten von einem Flaschenanforderungsbehandler hinaus. Ich sehe eine dict2json Methode in der Flasche src, aber ich bin nicht sicher, wie man es benutzt.Flasche und JSON

Was ist in der Dokumentation:

@route('/spam') 
def spam(): 
    return {'status':'online', 'servertime':time.time()} 

Das gibt mir, wenn ich die Seite bringen:

<html> 
    <head></head> 
    <body>statusservertime</body> 
</html> 
+1

I ging zu Flasche und es funktioniert gut. – arinte

+0

Sie können auch import json dann json.dumps (dict) verwenden. Aber gute Bewegung, ich gehe auch zwischen Flasche und Flasche und am Ende wählen Kolben. Ich mag Flasche, die leicht ist und keinen größeren Rahmen dahinter hat. Aber Dinge wie typisierte URL-Params gewinnen mich immer wieder zurück, wenn ich Dinge wie die Datumserkennung oder Indexe mache, d. H./Blog////Wo Flasche nur param Namen hat. Ein Pfad mit 4 Schrägstrichen ist also nicht immer eine Datums/Blog-URL. Ich benutze beide, aber tendieren zu Flaschen für größere Apps derzeit wegen solcher Sachen. –

+0

Ich habe dieses Problem auch. Wenn ich curl -I verwende, sehe ich, dass der Inhaltstyp falsch ist: Content-Type: text/html; charset = UTF-8 –

Antwort

43

einfach eine dict zurückzukehren. Bottle übernimmt die Konvertierung in JSON für Sie.

Sogar Wörterbücher sind erlaubt. Sie werden in json konvertiert und mit dem Header Content-Type zurückgegeben, der auf application/json gesetzt ist. Um diese Funktion zu deaktivieren (und dicts an Ihre Middleware zu übergeben), können Sie bottle.default_app(). Autojson auf False setzen.

@route('/api/status') 
def api_status(): 
    return {'status':'online', 'servertime':time.time()} 

von the documentation. Genommen für mich sehr gut

http://bottlepy.org/docs/stable/api.html#the-bottle-class

+2

Dies beantwortet nicht wirklich die Frage –

+4

Was? Es tut sicherlich ... –

3

return {'status':'online', 'servertime':time.time()} funktioniert. Haben Sie time importiert?

Dies funktioniert:

import time 
from bottle import route, run 

@route('/') 
def index(): 
    return {'status':'online', 'servertime':time.time()} 

run(host='localhost', port=8080) 
+0

Das hat nicht für mich funktioniert. Ich habe die Zeit importiert. Ich denke, es ist eine versionsbedingte Verhaltensänderung. –

6

Aus irgendeinem Grund Flasche des Auto-json-Funktion nicht für mich arbeiten. Wenn es auch nicht für Sie arbeiten, können Sie diese Dekorateur verwenden:

def json_result(f): 
    def g(*a, **k): 
     return json.dumps(f(*a, **k)) 
    return g 

Auch praktisch:

def mime(mime_type): 
    def decorator(f): 
     def g(*a, **k): 
      response.content_type = mime_type 
      return f(*a, **k) 
     return g 
    return decorator 
+0

Dies funktionierte großartig für mich, Arrays von Wörterbüchern, die nicht von Bottle behandelt werden –

+1

Sie sollten nicht eine Liste von Wörterbüchern zurückgeben, weshalb Flasche macht es so schwierig (und auch Flask). Siehe hier: http://flask.pooco.org/docs/security/#json-security –

+0

Wow, danke, dass du das herausgebracht hast. –

0

versuchen sollte dies funktioniert wie beabsichtigt

from bson.json_util import dumps 
from bottle import route, run 
import time 

@route('/') 
def index(): 
    return {'status':'online', 'servertime':dumps(time.time()) } 

run(host='localhost', port=8080) 
0

es ist leicht zu Erhalten Sie Json mit dem Anfragemodul der Flasche

from bottle import request 

json_data = request.json # json_data is in the dictionary format