2010-08-17 13 views
24

¿Cómo hago para devolver los datos de json desde un controlador de solicitud de botella? Veo un método dict2json en el src de la botella, pero no estoy seguro de cómo usarlo.Botella y Json

¿Cuál es en la documentación:

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

me da esto cuando aparezca la página:

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

I pasó al matraz y funciona bien. – arinte

+0

También puede usar import json then json.dumps (dict). Pero buen movimiento, también voy entre botella y matraz y termino eligiendo matraz. Me gusta que la botella sea liviana y que no tenga un marco más grande detrás de ella. Pero cosas como los parametros url mecanografiados siempre me vuelven a ganar por hacer cosas como detección de fecha o índices, es decir,/blog/////Donde la botella solo tiene: nombres de param. Entonces, una ruta con 4 barras diagonales no siempre es una URL de tipo fecha/blog. Yo uso ambos pero tienden a matracarse para aplicaciones más grandes actualmente debido a cosas como esta. –

+0

Tengo este problema también. Cuando uso curl -I, veo que el tipo de contenido es incorrecto: Content-Type: text/html; charset = UTF-8 –

Respuesta

43

simplemente devuelva un diccionario. Bottle maneja la conversión a JSON por usted.

Incluso se permiten diccionarios. Se convierten en json y se devuelven con el encabezado Content-Type establecido en application/json. Para desactivar esta característica (y pasar los dicts a su middleware) puede configurar bottle.default_app(). Autojson en False.

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

Tomado de the documentation.

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

+2

Esto no responde la pregunta –

+4

¿Qué? Ciertamente lo hace ... –

3

return {'status':'online', 'servertime':time.time()} funciona perfectamente bien para mí. ¿Ha importado time?

Esto funciona:

import time 
from bottle import route, run 

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

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

Eso no funcionó para mí. Yo importé el tiempo. Supongo que es un cambio de comportamiento relacionado con la versión. –

6

Por alguna razón, función de auto-JSON de la botella no funciona para mí. Si esto no funciona para usted tampoco, se puede usar el decorador:

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

También es práctico:

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

Esto funcionó muy bien para mí para devolver matrices de diccionarios, que no son manejadas por Bottle –

+1

No debería devolver una lista de diccionarios, razón por la cual la botella lo hace tan difícil (y Flask también). Vea aquí: http://flask.pocoo.org/docs/security/#json-security –

+0

Guau, gracias por señalar eso. –

0

tratar esto debería funciona como está previsto

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 fácil obtener json utilizando el módulo de solicitud de botella

from bottle import request 

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