2010-08-17 5 views
24

Comment faire pour renvoyer des données json à partir d'un gestionnaire de demandes de bouteilles. Je vois une méthode dict2json dans la bouteille src mais je ne suis pas sûr de savoir comment l'utiliser.Bouteille et JSON

Qu'est-ce que dans la documentation:

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

me donne quand je afficher la page:

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

I passé à flacon et ça fonctionne bien. – arinte

+0

Vous pouvez également utiliser import json puis json.dumps (dict). Mais bon mouvement, je vais aussi entre flacon et fiole et finis par choisir flacon. J'aime la bouteille étant légère et ne pas avoir un plus grand cadre derrière elle. Mais des choses comme les paramètres url tapés me gagnent toujours pour faire des choses comme la détection de date ou des index, par exemple/blog/////où la bouteille n'a que: les noms de paramètres. Donc, un chemin avec 4 barres obliques n'est pas toujours une URL de type date/blog. J'utilise les deux mais j'ai tendance à faire des flasques pour les plus grosses applications actuellement en raison de choses comme ça. –

+0

J'ai aussi ce problème. Quand j'utilise curl -I, je vois que le type de contenu est faux: Content-Type: text/html; charset = UTF-8 –

Répondre

43

simplement un retour dict. Bottle gère la conversion en JSON pour vous.

Même les dictionnaires sont autorisés. Ils sont convertis en json et renvoyés avec l'en-tête Content-Type défini sur application/json. Pour désactiver cette fonctionnalité (et passer des dits à votre middleware), vous pouvez définir bottle.default_app(). Autojson sur False.

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

Taken de the documentation.

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

+2

Cela ne répond pas vraiment à la question –

+4

Quoi? C'est certainement le cas ... –

3

return {'status':'online', 'servertime':time.time()} fonctionne parfaitement bien pour moi. Avez-vous déjà importé time?

Cela fonctionne:

import time 
from bottle import route, run 

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

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

Cela n'a pas fonctionné pour moi. J'ai importé du temps. Je suppose que c'est un changement de comportement lié à la version. –

6

Pour une raison quelconque, la fonction de bouteille auto-JSON ne fonctionne pas pour moi. Si cela ne fonctionne pas pour vous non plus, vous pouvez utiliser ce décorateur:

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

Aussi pratique:

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

Cela a fonctionné très bien pour moi de retourner des tableaux de dictionnaires, qui ne sont pas traitées par Bouteille –

+1

Vous ne devriez pas retourner une liste de dictionnaires, ce qui rend la bouteille si difficile (et Flask aussi bien). Voir ici: http://flask.pocoo.org/docs/security/#json-security –

+0

Wow, merci de le signaler. –

0

essayer ce devrait fonctionner comme prévu

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

il est facile de obtenir json en utilisant le module de demande de la bouteille

from bottle import request 

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