web-dev-qa-db-fra.com

Tornado request.body

Mon application Tornado accepte les données POST via une requête de corps http.

Dans mon gestionnaire, je peux obtenir la demande 

def post(self):
    data = self.request.body

Les données que je reçois sont dans le début de str (dictionnaire) 

Existe-t-il un moyen de recevoir ces données sous la forme d'un dictionnaire Python?

Je ne veux pas utiliser eval sur le côté serveur pour convertir cette chaîne en dictionnaire Python.

24
Joel James

En guise d'alternative à la réponse d'Eloim, Tornado fournit tornado.escape pour "HTML, JSON, URLs, etc." Son utilisation devrait vous donner exactement ce que vous voulez:

data = tornado.escape.json_decode(self.request.body)
37
Farray

Vous recevez une chaîne JSON . Décodez-la avec le module JSON.

import json

def post(self):
    data = json.loads(self.request.body)

Pour plus d'informations: http://docs.python.org/2/library/json.html

17
Eloims

Je pense avoir eu un problème similaire lors de l'analyse syntaxique des demandes dans Tornado. Essayez d’utiliser le module urllib.unquote_plus:

import urllib
try:
    import simplejson as json
except ImportError:
    import json


data = json.loads(urllib.unquote_plus(self.request.body))

Mon code devait être préparé pour les deux formats de demande, alors j'ai fait quelque chose comme:

try:
    json.loads(self.request.body)
except:
    json.loads(urllib.unquote_plus(self.request.body))
1
Mitch

Si vous utilisez WebApp2, il utilise ses propres extras json. (Decode) http://webapp2.readthedocs.io/en/latest/_modules/webapp2_extras/json.html

    data = json.decode(self.request.body)
    v = data.get(key)   
    self.response.write(v)

Par exemple, ma clé de publication est 'postvalue'

    data = json.decode(self.request.body)
    v = data.get('postvalue')   
    self.response.write(v)
0
ADL

que diriez-vous 

bind_args = dict((k,v[-1] ) for k, v in self.request.arguments.items())
0
suger